pax_global_header00006660000000000000000000000064135556657540014537gustar00rootroot0000000000000052 comment=fbe25305a7f37e978546a0bac51da725537892ad hypre-2.18.2/000077500000000000000000000000001355566575400127605ustar00rootroot00000000000000hypre-2.18.2/AUTOTEST/000077500000000000000000000000001355566575400142305ustar00rootroot00000000000000hypre-2.18.2/AUTOTEST/README.txt000066400000000000000000000042501355566575400157270ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/basic.sh000077500000000000000000000040631355566575400156530ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/check-double.filters000066400000000000000000000001501355566575400201430ustar00rootroot00000000000000/_hypre_utilities.h: /HYPRE_utilities.h: /utilities/hypre_general.h: /utilities/mpistubs.c double-check hypre-2.18.2/AUTOTEST/check-double.sh000077500000000000000000000016411355566575400171160ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/check-glob-symb.filters000066400000000000000000000000231355566575400205630ustar00rootroot00000000000000FEI_mv/SuperLU/SRC hypre-2.18.2/AUTOTEST/check-glob-symb.sh000077500000000000000000000024321355566575400175360ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/check-int.filters000066400000000000000000000006011355566575400174640ustar00rootroot00000000000000/f2c.h: /HYPRE_config.h: /hypre_printf.c: /_hypre_utilities.h: /HYPRE_utilities.h: /utilities/hypre_general.h: /utilities/mpistubs.c as long as too long long range interpolation long-range interpolation monstrously long get a long msg long rows utilities/hypre_hopscotch_hash.h: //return _InterlockedCompareExchange utilities/hypre_hopscotch_hash.h: //return _InterlockedExchangeAdd hypre-2.18.2/AUTOTEST/check-int.sh000077500000000000000000000017561355566575400164450ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/check-license.filters000066400000000000000000000005041355566575400203160ustar00rootroot00000000000000./AUTOTEST/.*.out ./AUTOTEST/.*.fil ./AUTOTEST/.*.err ./AUTOTEST/.*.log ./src/test/struct_migrate ./src/test/maxwell_unscaled ./src/test/sstruct_fac ./src/test/ams_driver ./src/test/zboxloop ./src/test/ij ./src/test/ij_mv ./src/test/struct ./src/test/sstruct ./src/zerr ./src/config.log ./src/config.status TVD.v3breakpointshypre-2.18.2/AUTOTEST/check-license.sh000077500000000000000000000045241355566575400172710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/check-mpi.filters000066400000000000000000000004551355566575400174660ustar00rootroot00000000000000/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.18.2/AUTOTEST/check-mpi.sh000077500000000000000000000016521355566575400164330ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/cleantest.sh000077500000000000000000000023331355566575400165520ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/cmake.sh000077500000000000000000000046241355566575400156550ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 ij_mv struct_migrate" # 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 {src_dir}, then optionally runs driver and example tests. Example usage: $0 ../src -co -DCMAKE_BUILD_TYPE=Debug -ro: -ij EOF exit ;; esac # Set src_dir src_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 $src_dir src_dir=`pwd` # Clean up the cmbuild directories (do it from src_dir as a precaution) cd $src_dir rm -fr `echo cmbuild/* | sed 's/[^ ]*README.txt//g'` # Clean up the previous install cd $src_dir rm -fr hypre # Configure cd $src_dir/cmbuild cmake $copts .. make $mopts install # Make cd $src_dir/cmbuild/test make $mopts mv -f $drivers ../../test cd $test_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 rm -fr `echo cmbuild/* | sed 's/[^ ]*README.txt//g'` rm -fr hypre ( cd $src_dir/test; rm -f $drivers; ./cleantest.sh ) hypre-2.18.2/AUTOTEST/configure.filters000066400000000000000000000000001355566575400175710ustar00rootroot00000000000000hypre-2.18.2/AUTOTEST/configure.sh000077500000000000000000000021161355566575400165500ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/docs.sh000077500000000000000000000015041355566575400155170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/examples.sh000077500000000000000000000034461355566575400164140ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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: -h|-help prints this usage information and exits {src_dir} is the hypre source directory - run (test = default, bigint, maxdim, complex) 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 ;; -*) 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 for tname in $tests do make $tname 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.18.2/AUTOTEST/klocwork.filters000066400000000000000000000000511355566575400174510ustar00rootroot00000000000000icc: command line warning .*: overriding hypre-2.18.2/AUTOTEST/klocwork.sh000077500000000000000000000041471355566575400164300ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/link.filters000066400000000000000000000004631355566575400165620ustar00rootroot00000000000000End 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.18.2/AUTOTEST/link.sh000077500000000000000000000012651355566575400155300ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-mac.sh000077500000000000000000000035001355566575400167270ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-ray.sh000077500000000000000000000103561355566575400167710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-rztopaz.sh000077500000000000000000000037561355566575400177150ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-syrah.sh000077500000000000000000000040341355566575400173200ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-tux-compilers.sh000077500000000000000000000045021355566575400210050ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-tux-exlibs.sh000077500000000000000000000037511355566575400203030ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/AUTOTEST/machine-tux.sh000077500000000000000000000130751355566575400170170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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="--enable-debug --enable-global-partition" RO="-fac" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $RO -eo: $eo ./renametest.sh basic $output_dir/basic-debug2 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="--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" ./test.sh basic.sh $src_dir -co: $co -mo: $mo ./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 -rt -valgrind ./renametest.sh basic $output_dir/basic--valgrind1 co="--enable-debug --enable-global-partition" ./test.sh basic.sh $src_dir -co: $co -mo: $mo -ro: $ro -rt -valgrind ./renametest.sh basic $output_dir/basic--valgrind2 # CMake build and run tests mo="-j" ro="-ams -ij -sstruct -struct -lobpcg" eo="" co="" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-default co="-DHYPRE_NO_GLOBAL_PARTITION=OFF" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-global-partition co="-DHYPRE_SEQUENTIAL=ON" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-sequential co="-DHYPRE_SHARED=ON" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo ./renametest.sh cmake $output_dir/cmake-shared co="-DHYPRE_SINGLE=ON" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo -ro: -single ./renametest.sh cmake $output_dir/cmake-single co="-DHYPRE_LONG_DOUBLE=ON" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo -ro: -longdouble ./renametest.sh cmake $output_dir/cmake-longdouble co="-DCMAKE_BUILD_TYPE=Debug" ./test.sh cmake.sh $src_dir -co: $co -mo: $mo -ro: $ro ./renametest.sh cmake $output_dir/cmake-debug co="-DHYPRE_BIGINT=ON" ./test.sh cmake.sh $src_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.18.2/AUTOTEST/machine-vs-pro.bat000077500000000000000000000033011355566575400175500ustar00rootroot00000000000000@echo off rem Copyright 1998-2019 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.18.2/AUTOTEST/make.filters000066400000000000000000000016531355566575400165440ustar00rootroot00000000000000slu_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. hypre-2.18.2/AUTOTEST/make.sh000077500000000000000000000012241355566575400155030ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <] where: -h|-help prints this usage information and exits {src_dir} is the hypre source directory - run (test = ams, fac, ij, sstruct, struct) -all run all tests (default behavior) 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 ;; -*) tname=`echo $1 | sed 's/-//'` tests="$tests $tname" shift ;; esac done # If no tests were specified, run all tests if [ "$tests" = "" ]; then tests="ams fac ij sstruct struct" fi # Setup 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 ./runtest.sh $@ TEST_$tname/*.sh 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.18.2/AUTOTEST/test.sh000077500000000000000000000041531355566575400155510ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/CHANGELOG000066400000000000000000001160241355566575400141760ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.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.18.2/COPYRIGHT000066400000000000000000000023471355566575400142610ustar00rootroot00000000000000 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.18.2/INSTALL.md000066400000000000000000000074701355566575400144200ustar00rootroot00000000000000 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 2.8.8 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. Directories `src/cmbuild` and `src/test/cmbuild` are provided in the release for convenience, but alternative build directories may be created by the user: - Unix: From the `src/cmbuild` directory, type `cmake ..`. - Windows: Set the source and build directories to `src` and `src/cmbuild`, then click on 'Configure' following by 'Generate'. 3. To complete the build of the library, compile with the native build system: - Unix: From the `src/cmbuild` 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 `src/cmbuild` directory, type `ccmake ..`, 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.18.2/LICENSE-APACHE000066400000000000000000000261361355566575400147140ustar00rootroot00000000000000 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.18.2/LICENSE-MIT000066400000000000000000000022201355566575400144100ustar00rootroot00000000000000Copyright 1998-2019 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.18.2/NOTICE000066400000000000000000000022171355566575400136660ustar00rootroot00000000000000This 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.18.2/README.md000066400000000000000000000024211355566575400142360ustar00rootroot00000000000000 ![](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. Documentation can be found [here](https://hypre.readthedocs.io/en/latest/). 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). We appreciate feedback from users. Please submit comments, suggestions, and issue reports to hypre-support@llnl.gov. 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.18.2/src/000077500000000000000000000000001355566575400135475ustar00rootroot00000000000000hypre-2.18.2/src/CMakeLists.txt000066400000000000000000000245601355566575400163160ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 2.8.8) if (POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif (POLICY CMP0074) project (hypre) # The version number. set (HYPRE_VERSION 2.18.2) set (HYPRE_DATE 2019/10/28) set (HYPRE_TIME 00:00:00) set (HYPRE_BUGS hypre-support@llnl.gov) set (HYPRE_SRCDIR "${PROJECT_SOURCE_DIR}") 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 cmake module path set(CMAKE_MODULE_PATH ${hypre_SOURCE_DIR}/config/cmake) include(hypre_CMakeUtilities) # Set default installation directory, but provide a means for users to change set (HYPRE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/hypre" CACHE PATH "Installation directory for HYPRE") set (CMAKE_INSTALL_PREFIX "${HYPRE_INSTALL_PREFIX}" CACHE INTERNAL "" FORCE) # Set default compile optimization flag set (HYPRE_BUILD_TYPE "Release" CACHE STRING "Optimization flags: set to Debug, Release, RelWithDebInfo, or MinSizeRel") set (CMAKE_BUILD_TYPE "${HYPRE_BUILD_TYPE}" CACHE INTERNAL "" FORCE) # Configuration options option(HYPRE_ENABLE_SHARED "Build a shared library" OFF) option(HYPRE_ENABLE_BIGINT "Use long long int for HYPRE_Int" OFF) option(HYPRE_ENABLE_MIXEDINT "Use long long int for HYPRE_BigInt, int for HYPRE_INT" OFF) option(HYPRE_ENABLE_SINGLE "Use float for HYPRE_Real" OFF) option(HYPRE_ENABLE_LONG_DOUBLE "Use long double for HYPRE_Real" OFF) option(HYPRE_ENABLE_COMPLEX "Use complex values" OFF) option(HYPRE_ENABLE_HYPRE_BLAS "Use internal BLAS library" ON) option(HYPRE_ENABLE_HYPRE_LAPACK "Use internal LAPACK library" ON) option(HYPRE_ENABLE_PERSISTENT_COMM "Use persistent communication" OFF) option(HYPRE_ENABLE_GLOBAL_PARTITION "Use global partitioning" OFF) option(HYPRE_ENABLE_FEI "Use FEI" OFF) # TODO: Add this cmake feature option(HYPRE_WITH_MPI "Compile with MPI" ON) option(HYPRE_WITH_OPENMP "Use OpenMP" OFF) option(HYPRE_WITH_HOPSCOTCH "Use hopscotch hashing with OpenMP" OFF) option(HYPRE_WITH_DSUPERLU "Use TPL SuperLU_Dist" OFF) option(HYPRE_WITH_CALIPER "Use Caliper" OFF) # TODO: Finish this cmake feature option(HYPRE_PRINT_ERRORS "Print HYPRE errors" OFF) option(HYPRE_TIMING "Use HYPRE timing routines" OFF) option(HYPRE_BUILD_EXAMPLES "Build examples" OFF) option(HYPRE_BUILD_TESTS "Build tests" OFF) option(TPL_DSUPERLU_LIBRARIES "List of absolute paths to SuperLU_Dist link libraries [].") option(TPL_DSUPERLU_INCLUDE_DIRS "List of absolute paths to SuperLU_Dist include directories [].") # Set config name values if (HYPRE_ENABLE_SHARED) set(HYPRE_SHARED ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_BIGINT) set(HYPRE_BIGINT ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_MIXEDINT) set(HYPRE_MIXEDINT ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_SINGLE) set(HYPRE_SINGLE ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_LONG_DOUBLE) set(HYPRE_LONG_DOUBLE ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_COMPLEX) set(HYPRE_COMPLEX ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_HYPRE_BLAS) set(HYPRE_USING_HYPRE_BLAS ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_HYPRE_LAPACK) set(HYPRE_USING_HYPRE_LAPACK ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_PERSISTENT_COMM) set(HYPRE_USING_PERSISTENT_COMM ON CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_GLOBAL_PARTITION) set(HYPRE_NO_GLOBAL_PARTITION OFF CACHE BOOL "" FORCE) elseif() set(HYPRE_NO_GLOBAL_PARTITION ON CACHE BOOL "" FORCE) endif() if (HYPRE_WITH_MPI) set(HYPRE_SEQUENTIAL OFF CACHE BOOL "" FORCE) elseif() set(HYPRE_SEQUENTIAL ON CACHE BOOL "" FORCE) endif() if (HYPRE_WITH_OPENMP) set (HYPRE_USING_OPENMP ON CACHE BOOL "" FORCE) endif() if (HYPRE_WITH_HOPSCOTCH) set (HYPRE_HOPSCOTCH ON CACHE BOOL "" FORCE) endif() if (HYPRE_WITH_DSUPERLU) set (HYPRE_USING_DSUPERLU ON CACHE BOOL "" FORCE) set (HYPRE_USING_HYPRE_BLAS OFF CACHE BOOL "" FORCE) set (HYPRE_USING_HYPRE_LAPACK OFF CACHE BOOL "" FORCE) endif() if (HYPRE_ENABLE_FEI) set (HYPRE_USING_FEI ON CACHE BOOL "" FORCE) message(WARNING "CMake support for FEI is not complete!") endif() if (HYPRE_WITH_CALIPER) set (HYPRE_USING_CALIPER ON CACHE BOOL "" FORCE) endif() if (HYPRE_SHARED OR HYPRE_BIGINT OR HYPRE_SINGLE OR HYPRE_LONG_DOUBLE) # FEI doesn't currently compile with shared set (HYPRE_USING_FEI OFF CACHE BOOL "" FORCE) endif () if (HYPRE_SEQUENTIAL) set (HYPRE_NO_GLOBAL_PARTITION OFF CACHE BOOL "" FORCE) set (HYPRE_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) endif () # Headers and sources set (HYPRE_HEADERS "") set (HYPRE_SOURCES "") # Headers and sources: . list (APPEND HYPRE_HEADERS "${PROJECT_BINARY_DIR}/HYPRE_config.h" HYPREf.h HYPRE.h ) # This is a list of TPLs that are used by all targets set(TPL_LIBRARIES "") # This is a list of linker flags to be used with TPLs for all targets set(TPL_LINKER_FLAGS "") # Headers and sources: blas if (HYPRE_USING_HYPRE_BLAS) add_subdirectory(blas) else() # Find system blas find_package(BLAS REQUIRED) list(APPEND TPL_LIBRARIES ${BLAS_LIBRARIES}) set(CMAKE_C_FLAGS "-DUSE_VENDOR_BLAS ${CMAKE_C_FLAGS}") endif() # Headers and sources: lapack if (HYPRE_USING_HYPRE_LAPACK) add_subdirectory(lapack) else() # Find system lapack find_package(LAPACK REQUIRED) list(APPEND TPL_LIBRARIES ${LAPACK_LIBRARIES}) endif() # Find DSUPERLU, if requested if (HYPRE_USING_DSUPERLU) if (NOT TPL_DSUPERLU_LIBRARIES) message(FATAL_ERROR "TPL_DSUPERLU_LIBRARIES option should be set for SuperLU_Dist support.") endif() if (NOT TPL_DSUPERLU_INCLUDE_DIRS) message(FATAL_ERROR "TPL_DSUPERLU_INCLUDE_DIRS option be set for SuperLU_Dist support.") endif() foreach(dir ${TPL_DSUPERLU_INCLUDE_DIRS}) if (NOT EXISTS ${dir}) message(FATAL_ERROR "SuperLU_Dist include directory not found: ${dir}") endif() set(CMAKE_C_FLAGS "-I${dir} ${CMAKE_C_FLAGS}") endforeach() message("-- Enabled support for using DSUPERLU.") set(DSUPERLU_FOUND TRUE) list(APPEND TPL_LIBRARIES ${TPL_DSUPERLU_LIBRARIES} stdc++) endif() if (TPL_DSUPERLU_INCLUDE_DIRS) include_directories(${TPL_DSUPERLU_INCLUDE_DIRS}) endif () if(DSUPERLU_FOUND) set(HYPRE_USING_DSUPERLU TRUE) endif() # Headers and sources: remaining subdirectories set(HYPRE_DIRS utilities multivector krylov seq_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}) endforeach() # Configure a header file to pass CMake settings to the source code configure_file ( "${PROJECT_SOURCE_DIR}/config/HYPRE_config.h.cmake.in" "${PROJECT_BINARY_DIR}/HYPRE_config.h" ) # BINARY must be first in order to get the correct HYPRE_config.h file include_directories(${hypre_BINARY_DIR}) include_directories(${hypre_SOURCE_DIR}) include_directories(blas) include_directories(lapack) # Add remaining subdirectories foreach(DIR IN LISTS HYPRE_DIRS) include_directories(${DIR}) endforeach() include_directories(distributed_ls/Euclid) include_directories(distributed_ls/ParaSails) # Set library build type if (HYPRE_SHARED) set (BUILD_SHARED_LIBS ON CACHE INTERNAL "" FORCE) else () set (BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) endif () # Set MPI compile flags if (NOT HYPRE_SEQUENTIAL) find_package (MPI) if ((MPI_C_FOUND) AND (NOT CMAKE_C_COMPILER STREQUAL MPI_C_COMPILER)) include_directories (${MPI_C_INCLUDE_PATH}) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MPI_C_COMPILE_FLAGS}") list(APPEND TPL_LIBRARIES ${MPI_C_LIBRARIES}) endif () endif (NOT HYPRE_SEQUENTIAL) # Set OpenMP compile flags if (HYPRE_USING_OPENMP) find_package (OpenMP) if (OPENMP_FOUND) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") endif (OPENMP_FOUND) endif (HYPRE_USING_OPENMP) if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) # Use the C++ compiler to compile these files to get around lack of C99 support set_source_files_properties (utilities/hypre_hopscotch_hash.c PROPERTIES COMPILE_FLAGS /TP) set_source_files_properties (utilities/hypre_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) #Fix issue with visual studio 2013 set_source_files_properties (struct_ls/pfmg3_setup_rap.c PROPERTIES COMPILE_FLAGS /Od) endif () 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() # Cleanup the TPL list list(REMOVE_DUPLICATES TPL_LIBRARIES) add_library (HYPRE ${HYPRE_SOURCES} ${HYPRE_HEADERS} ${FEI_LIBS}) target_link_libraries(HYPRE PUBLIC ${TPL_LIBRARIES}) install (TARGETS HYPRE DESTINATION lib) install (FILES ${HYPRE_HEADERS} DESTINATION include) hypre-2.18.2/src/FEI_mv/000077500000000000000000000000001355566575400146545ustar00rootroot00000000000000hypre-2.18.2/src/FEI_mv/CMakeLists.txt000066400000000000000000000016711355566575400174210ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) project(HYPRE_FEI C CXX) 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) set(FEI_LIBS ${FEI_LIBS} $) set(FEI_LIBS ${FEI_LIBS} PARENT_SCOPE) hypre-2.18.2/src/FEI_mv/Makefile000066400000000000000000000015251355566575400163170ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/fei-hypre/000077500000000000000000000000001355566575400165445ustar00rootroot00000000000000hypre-2.18.2/src/FEI_mv/fei-hypre/CHANGELOG000066400000000000000000000256271355566575400177720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/CMakeLists.txt000066400000000000000000000025561355566575400213140ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) add_library(HYPRE_fei OBJECT ${HYPRE_fei_SRCS}) install (FILES ${HYPRE_fei_HEADERS} DESTINATION include) hypre-2.18.2/src/FEI_mv/fei-hypre/FEI_HYPRE_Impl.cxx000066400000000000000000004171031355566575400216310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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(); 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.18.2/src/FEI_mv/fei-hypre/FEI_HYPRE_Impl.h000066400000000000000000000142631355566575400212560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/FEI_HYPRE_include.h000066400000000000000000000014651355566575400220000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_Builder.h000066400000000000000000000021351355566575400212530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_FEI.doc000066400000000000000000000623221355566575400206120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 perconditioners * 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.18.2/src/FEI_mv/fei-hypre/HYPRE_FEI.h000066400000000000000000000352231355566575400202740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_FEI_includes.h000066400000000000000000000037611355566575400221640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx000066400000000000000000007531331355566575400215510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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); 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 ); assert(!ierr); HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); 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); 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); 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 ); assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); 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 ); assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); 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); 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); 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 ); assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); 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); 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); 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 ); assert(!ierr); ierr = HYPRE_ParCSRMatrixMatvec( -1.0, A_csr, x_csr, 1.0, r_csr ); assert(!ierr); ierr = HYPRE_ParVectorInnerProd( r_csr, r_csr, &rnorm); 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]); 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]); 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]); 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]); 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_); 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_); 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_); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_Dsuperlu.c000066400000000000000000000310561355566575400221760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "superlu_ddefs.h" typedef struct HYPRE_LSI_DSuperLU_Struct { MPI_Comm comm_; HYPRE_ParCSRMatrix Amat_; superlu_dist_options_t options_; SuperMatrix sluAmat_; ScalePermstruct_t ScalePermstruct_; SuperLUStat_t stat_; LUstruct_t LUstruct_; SOLVEstruct_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_LSI_DSuperLU *sluPtr; sluPtr = hypre_TAlloc(HYPRE_LSI_DSuperLU, 1, HYPRE_MEMORY_HOST); assert ( sluPtr != NULL ); sluPtr->comm_ = comm; sluPtr->Amat_ = NULL; sluPtr->localNRows_ = 0; sluPtr->globalNRows_ = 0; sluPtr->startRow_ = 0; sluPtr->outputLevel_ = 0; sluPtr->setupFlag_ = 0; sluPtr->berr_ = hypre_TAlloc(double, 1, HYPRE_MEMORY_HOST); *solver = (HYPRE_Solver) sluPtr; return 0; } /*************************************************************************** * HYPRE_LSI_DSuperLUDestroy - Destroy a DSuperLU object. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUDestroy( HYPRE_Solver solver ) { HYPRE_LSI_DSuperLU *sluPtr; sluPtr = (HYPRE_LSI_DSuperLU *) solver; sluPtr->Amat_ = NULL; if (sluPtr->setupFlag_ == 1) { PStatFree(&(sluPtr->stat_)); Destroy_CompRowLoc_Matrix_dist(&(sluPtr->sluAmat_)); ScalePermstructFree(&(sluPtr->ScalePermstruct_)); Destroy_LU(sluPtr->globalNRows_, &(sluPtr->sluGrid_), &(sluPtr->LUstruct_)); LUstructFree(&(sluPtr->LUstruct_)); if (sluPtr->options_.SolveInitialized) dSolveFinalize(&(sluPtr->options_), &(sluPtr->SOLVEstruct_)); superlu_gridexit(&(sluPtr->sluGrid_)); } free(sluPtr->berr_); free(sluPtr); return 0; } /*************************************************************************** * 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 ) { int nprocs, mypid, nprow, npcol, info, iZero=0; HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver; MPI_Comm mpiComm; /* ---------------------------------------------------------------- */ /* get machine information */ /* ---------------------------------------------------------------- */ mpiComm = sluPtr->comm_; MPI_Comm_size(mpiComm, &nprocs); MPI_Comm_rank(mpiComm, &mypid); /* ---------------------------------------------------------------- */ /* compute grid information */ /* ---------------------------------------------------------------- */ nprow = sluPtr->sluGrid_.nprow = 1; npcol = sluPtr->sluGrid_.npcol = nprocs; superlu_gridinit(mpiComm, nprow, npcol, &(sluPtr->sluGrid_)); if (mypid != sluPtr->sluGrid_.iam) { printf("DSuperLU ERROR: mismatched mypid and SuperLU iam.\n"); exit(1); } /* ---------------------------------------------------------------- */ /* get whole matrix and compose SuperLU matrix */ /* ---------------------------------------------------------------- */ sluPtr->Amat_ = A_csr; HYPRE_LSI_DSuperLUGenMatrix(solver); /* ---------------------------------------------------------------- */ /* set solver options */ /* ---------------------------------------------------------------- */ set_default_options_dist(&(sluPtr->options_)); /* options->Fact = DOFACT (SamePattern,FACTORED} options->Equil = YES (NO, ROW, COL, BOTH) (YES not robust) options->ParSymbFact = NO; options->ColPerm = MMD_AT_PLUS_A (NATURAL, MMD_ATA, METIS_AT_PLUS_A, PARMETIS, MY_PERMC} (MMD_AT_PLUS_A the fastest, a factor of 3+ better than MMD_ATA, which in turn is 25% better than NATURAL) options->RowPerm = LargeDiag (NOROWPERM, MY_PERMR) options->ReplaceTinyPivot = YES (NO) options->IterRefine = DOUBLE (NOREFINE, SINGLE, EXTRA) (EXTRA not supported, DOUBLE more accurate) options->Trans = NOTRANS (TRANS, CONJ) options->SolveInitialized = NO; options->RefineInitialized = NO; options->PrintStat = YES; */ sluPtr->options_.Fact = DOFACT; sluPtr->options_.Equil = YES; sluPtr->options_.IterRefine = SLU_DOUBLE; sluPtr->options_.ColPerm = MMD_AT_PLUS_A; sluPtr->options_.DiagPivotThresh = 1.0; sluPtr->options_.ReplaceTinyPivot = NO; if (sluPtr->outputLevel_ < 2) sluPtr->options_.PrintStat = NO; ScalePermstructInit(sluPtr->globalNRows_, sluPtr->globalNRows_, &(sluPtr->ScalePermstruct_)); // LUstructInit(sluPtr->globalNRows_, sluPtr->globalNRows_, // &(sluPtr->LUstruct_)); LUstructInit(sluPtr->globalNRows_, &(sluPtr->LUstruct_)); sluPtr->berr_[0] = 0.0; PStatInit(&(sluPtr->stat_)); pdgssvx(&(sluPtr->options_), &(sluPtr->sluAmat_), &(sluPtr->ScalePermstruct_), NULL, sluPtr->localNRows_, iZero, &(sluPtr->sluGrid_), &(sluPtr->LUstruct_), &(sluPtr->SOLVEstruct_), sluPtr->berr_, &(sluPtr->stat_), &info); sluPtr->options_.Fact = FACTORED; if (sluPtr->outputLevel_ >= 2) PStatPrint(&(sluPtr->options_),&(sluPtr->stat_),&(sluPtr->sluGrid_)); sluPtr->setupFlag_ = 1; if (mypid == 0 && sluPtr->outputLevel_ >=2) { printf("DSuperLUSetup: diagScale = %d\n", sluPtr->ScalePermstruct_.DiagScale); printf("DSuperLUSetup: berr = %e\n", sluPtr->berr_[0]); printf("DSuperLUSetup: info = %d\n", info); } return 0; } /*************************************************************************** * HYPRE_LSI_DSuperLUSolve - Solve function for DSuperLU. *--------------------------------------------------------------------------*/ int HYPRE_LSI_DSuperLUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { int localNRows, irow, iOne=1, info, mypid; double *rhs, *soln; HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver; /* ---------------------------------------------------------------- */ /* get machine, matrix, and vector information */ /* ---------------------------------------------------------------- */ MPI_Comm_rank(sluPtr->comm_, &mypid); localNRows = sluPtr->localNRows_; rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b)); soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x)); for (irow = 0; irow < localNRows; irow++) soln[irow] = rhs[irow]; /* ---------------------------------------------------------------- */ /* solve */ /* ---------------------------------------------------------------- */ pdgssvx(&(sluPtr->options_), &(sluPtr->sluAmat_), &(sluPtr->ScalePermstruct_), soln, localNRows, iOne, &(sluPtr->sluGrid_), &(sluPtr->LUstruct_), &(sluPtr->SOLVEstruct_), sluPtr->berr_, &(sluPtr->stat_), &info); /* ---------------------------------------------------------------- */ /* diagnostics message */ /* ---------------------------------------------------------------- */ if (mypid == 0 && sluPtr->outputLevel_ >=2) { printf("DSuperLUSolve: info = %d\n", info); printf("DSuperLUSolve: diagScale = %d\n", sluPtr->ScalePermstruct_.DiagScale); } return 0; } /**************************************************************************** * 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); free(procNRows); return 0; } #else int bogus; #endif hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_Dsuperlu.h000066400000000000000000000026071355566575400222030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_UZAWA.cxx000066400000000000000000001745051355566575400216510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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); 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); 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); 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); 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); 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); 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); 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); 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); assert(!ierr); ierr = HYPRE_IJMatrixCreate(mpiComm_,A11StartRow,A11StartRow+A11NRows-1, A12StartCol,A12StartCol+A12NCols-1,&IJA12); ierr += HYPRE_IJMatrixSetObjectType(IJA12, HYPRE_PARCSR); 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); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJA12, A12MatSize); ierr += HYPRE_IJMatrixInitialize(IJA12); 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); assert( !ierr ); ierr = HYPRE_IJMatrixSetValues(IJA12, 1, &A12RowSize, (const int *) &rowIndex, (const int *) A12ColInd, (const double *) A12ColVal); 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); assert(!ierr); A11MatSize = new int[A11NRows]; for ( irow = 0; irow < A11NRows; irow++ ) A11MatSize[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(ainvA11, A11MatSize); ierr += HYPRE_IJMatrixInitialize(ainvA11); 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); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_UZAWA.h000066400000000000000000000100631355566575400212620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_Uzawa_c.h000066400000000000000000000031531355566575400217660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_blkprec.cxx000066400000000000000000003176711355566575400224070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_blkprec.h000066400000000000000000000156751355566575400220330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_block.h000066400000000000000000000033231355566575400214660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_ddict.c000066400000000000000000001222431355566575400214610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; if ( ict_ptr->mat_ja != NULL ) free(ict_ptr->mat_ja); if ( ict_ptr->mat_aa != NULL ) free(ict_ptr->mat_aa); ict_ptr->mat_ja = NULL; ict_ptr->mat_aa = NULL; if ( ict_ptr->mh_mat != NULL ) { if (ict_ptr->mh_mat->sendProc != NULL) free(ict_ptr->mh_mat->sendProc); if (ict_ptr->mh_mat->sendLeng != NULL) free(ict_ptr->mh_mat->sendLeng); if (ict_ptr->mh_mat->recvProc != NULL) free(ict_ptr->mh_mat->recvProc); if (ict_ptr->mh_mat->recvLeng != NULL) free(ict_ptr->mh_mat->recvLeng); for ( i = 0; i < ict_ptr->mh_mat->sendProcCnt; i++ ) if (ict_ptr->mh_mat->sendList[i] != NULL) free(ict_ptr->mh_mat->sendList[i]); if (ict_ptr->mh_mat->sendList != NULL) free(ict_ptr->mh_mat->sendList); free(ict_ptr); } ict_ptr->mh_mat = NULL; free(ict_ptr); 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] ); } if ( dbuf != NULL ) free(dbuf); 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]; if ( ibuf != NULL ) free(ibuf); if ( dbuf != NULL ) free(dbuf); if ( dbuf2 != NULL ) free(dbuf2); free(context); 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]; free(parray); free(parray2); } /* ---------------------------------------------------------------- */ /* 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; if ( recv_lengths != NULL ) free( recv_lengths ); if ( int_buf != NULL ) free( int_buf ); if ( dble_buf != NULL ) free( dble_buf ); if ( map != NULL ) free( map ); if ( map2 != NULL ) free( map2 ); free( context->partition ); free( context ); 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) { free(cols); free(vals); 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); free( temp_list ); } free(cols); free(vals); free(context); /* ---------------------------------------------------------------- */ /* wait for messages */ /* ---------------------------------------------------------------- */ for ( i = 0; i < nRecv; i++ ) { MPI_Wait( &Request[i], &status ); } if (nRecv > 0) free( Request ); 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) { free(cols); free(vals); 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 ) free( send_buf ); } free(cols); free(vals); /* ---------------------------------------------------------------- */ /* 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 ) free( isend_buf ); } free(cols); free(vals); /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } free(request); free(context); 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]; free(proc_array2); /* ---------------------------------------------------------------- */ /* 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; free( dble_array ); free(context); /* ---------------------------------------------------------------- */ /* 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); free(proc_array); 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) { free(vals); free(cols); 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 */ /* ---------------------------------------------------------------- */ if ( Amat->rowptr != NULL ) {free (Amat->rowptr); Amat->rowptr = NULL;} if ( Amat->colnum != NULL ) {free (Amat->colnum); Amat->colnum = NULL;} if ( Amat->values != NULL ) {free (Amat->values); Amat->values = NULL;} free(context); free(cols); free(vals); /* ---------------------------------------------------------------- */ /* call ICT factorization */ /* ---------------------------------------------------------------- */ HYPRE_LSI_DDICTFactorize(ict_ptr, mat_aa, mat_ja, mat_ia, rowNorms); free( mat_aa ); free( mat_ia ); free( mat_ja ); free(rowNorms); 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 */ /* ---------------------------------------------------------- */ free(track_array); free(sortcols); free(sortvals); free(dble_buf); free(msc_jptr); free(msc_jend); free(msc_aptr); ict_ptr->mat_ja = msr_iptr; ict_ptr->mat_aa = msr_aptr; return 0; } hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_ddict.h000066400000000000000000000030031355566575400214560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_ddilut.c000066400000000000000000002416471355566575400216710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; if ( ilut_ptr->mat_ia != NULL ) free(ilut_ptr->mat_ia); if ( ilut_ptr->mat_ja != NULL ) free(ilut_ptr->mat_ja); if ( ilut_ptr->mat_aa != NULL ) free(ilut_ptr->mat_aa); ilut_ptr->mat_ia = NULL; ilut_ptr->mat_ja = NULL; ilut_ptr->mat_aa = NULL; if ( ilut_ptr->mh_mat != NULL ) { if (ilut_ptr->mh_mat->sendProc != NULL) free(ilut_ptr->mh_mat->sendProc); if (ilut_ptr->mh_mat->sendLeng != NULL) free(ilut_ptr->mh_mat->sendLeng); if (ilut_ptr->mh_mat->recvProc != NULL) free(ilut_ptr->mh_mat->recvProc); if (ilut_ptr->mh_mat->recvLeng != NULL) free(ilut_ptr->mh_mat->recvLeng); for ( i = 0; i < ilut_ptr->mh_mat->sendProcCnt; i++ ) if (ilut_ptr->mh_mat->sendList[i] != NULL) free(ilut_ptr->mh_mat->sendList[i]); if (ilut_ptr->mh_mat->sendList != NULL) free(ilut_ptr->mh_mat->sendList); free( ilut_ptr->mh_mat ); } ilut_ptr->mh_mat = NULL; if ( ilut_ptr->order_array != NULL ) free(ilut_ptr->order_array); if ( ilut_ptr->reorder_array != NULL ) free(ilut_ptr->reorder_array); free(ilut_ptr); 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]; free(dbuffer); free(idiag); free(context); 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]; free(parray); free(parray2); } /* ---------------------------------------------------------------- */ /* 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; if ( mh_mat->rowptr != NULL ) free (mh_mat->rowptr); if ( mh_mat->colnum != NULL ) free (mh_mat->colnum); if ( mh_mat->values != NULL ) free (mh_mat->values); mh_mat->rowptr = NULL; mh_mat->colnum = NULL; mh_mat->values = NULL; if ( map != NULL ) free(map); if ( map2 != NULL ) free(map2); if ( int_buf != NULL ) free(int_buf); if ( dble_buf != NULL ) free(dble_buf); if ( recv_lengths != NULL ) free(recv_lengths); free( context->partition ); free( context ); 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) { free(cols); free(vals); 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); free( temp_list ); } free(cols); free(vals); free(context); /* ---------------------------------------------------------------- */ /* wait for messages */ /* ---------------------------------------------------------------- */ for ( i = 0; i < nRecv; i++ ) { MPI_Wait( &Request[i], &status ); } if (nRecv > 0) free( Request ); 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) { free(cols); free(vals); 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 ) free( send_buf ); } free(cols); free(vals); /* ---------------------------------------------------------------- */ /* 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 ) free( isend_buf ); } free(cols); free(vals); /* ----------------------------------------------------------- */ /* post receives for all messages */ /* ----------------------------------------------------------- */ for (i = 0; i < nRecv; i++) { MPI_Wait(request+i, &status); } free(request); free(context); 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]; free(proc_array2); /* ---------------------------------------------------------------- */ /* 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; free( dble_array ); free(context); /* ---------------------------------------------------------------- */ /* 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); free(proc_array); 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) { free(vals); free(cols); 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; } free( vals ); free( cols ); /* ---------------------------------------------------------------- */ /* 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]]; free( rowNorms ); 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; } free(Amat_ia); free(Amat_ja); free(Amat_aa); 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 */ /* ---------------------------------------------------------- */ free(cols); free(vals); free(sortcols); free(sortvals); free(dble_buf); free(diagonal); free(rowNorms); free(context); free(track_array); 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) { free(vals); free(cols); 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; } if ( mat_ia != NULL ) free( mat_ia ); if ( mat_ja != NULL ) free( mat_ja ); if ( mat_aa != NULL ) free( mat_aa ); 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 */ /* ---------------------------------------------------------- */ free(cols); free(vals); free(sortcols); free(sortvals); free(dble_buf); free(diagonal); free(rowNorms); free(context); free(track_array); 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) { free(vals); free(cols); 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 */ /* ---------------------------------------------------------- */ free(cols); free(vals); free(dble_buf); free(diagonal); free(rowNorms); free(context); free(track_array); 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) { free(vals); free(cols); 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]; free( iarray ); } 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; free(mat_ia); free(mat_ja); free(mat_aa); free(cols); free(vals); free(dble_buf); free(diagonal); free(rowNorms); free(context); free(track_array); return 0; } hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_ddilut.h000066400000000000000000000032151355566575400216610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_ml.c000066400000000000000000001305021355566575400207770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); if ( dbuf != NULL ) free( dbuf ); } 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 ) free ( request ); 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 ) free ( request ); 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; } if ( dbuf != NULL ) free( dbuf ); 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) ); if ( link->contxt->partition != NULL ) free( link->contxt->partition ); if ( link->contxt->Amat != NULL ) { Amat = (MH_Matrix *) link->contxt->Amat; if ( Amat->sendProc != NULL ) free (Amat->sendProc); if ( Amat->sendLeng != NULL ) free (Amat->sendLeng); if ( Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++ ) if (Amat->sendList[i] != NULL) free (Amat->sendList[i]); free (Amat->sendList); } if ( Amat->recvProc != NULL ) free (Amat->recvProc); if ( Amat->recvLeng != NULL ) free (Amat->recvLeng); if ( Amat->map != NULL ) free (Amat->map); free( Amat ); } if ( link->contxt != NULL ) free( link->contxt ); free( link ); 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]; free( diagSize ); free( offdiagSize ); /* -------------------------------------------------------- */ /* 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); } 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]; free( sendLeng ); 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 ) free( Request ); /* ----------------------------------------------------- */ /* 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 */ /* ----------------------------------------------------- */ free( tempCnt ); } return 0; #else nprocs = 1; return (nprocs-1); #endif } hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_mli.cxx000066400000000000000000002162611355566575400215370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_mli.h000066400000000000000000000072021355566575400211550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_mlmaxwell.c000066400000000000000000001143251355566575400223760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); if (dbuf != NULL) free(dbuf); } 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) free (requests); 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; } if (dbuf != NULL) free(dbuf); 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)); if (link->Aee_contxt->partition != NULL) free(link->Aee_contxt->partition); if (link->Ann_contxt->partition != NULL) free(link->Ann_contxt->partition); if (link->Aee_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->Aee_contxt->Amat; if (Amat->sendProc != NULL ) free (Amat->sendProc); if (Amat->sendLeng != NULL ) free (Amat->sendLeng); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) if (Amat->sendList[i] != NULL) free (Amat->sendList[i]); free (Amat->sendList); } if (Amat->recvProc != NULL) free (Amat->recvProc); if (Amat->recvLeng != NULL) free (Amat->recvLeng); if (Amat->map != NULL) free (Amat->map); free(Amat); } if (link->Aee_contxt != NULL) free(link->Aee_contxt); if (link->Ann_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->Ann_contxt->Amat; if (Amat->sendProc != NULL ) free (Amat->sendProc); if (Amat->sendLeng != NULL ) free (Amat->sendLeng); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) if (Amat->sendList[i] != NULL) free (Amat->sendList[i]); free (Amat->sendList); } if (Amat->recvProc != NULL) free (Amat->recvProc); if (Amat->recvLeng != NULL) free (Amat->recvLeng); if (Amat->map != NULL) free (Amat->map); free(Amat); } if (link->Ann_contxt != NULL) free(link->Ann_contxt); if (link->G_contxt->Amat != NULL) { Amat = (HYPRE_ML_Matrix *) link->G_contxt->Amat; if (Amat->sendProc != NULL ) free (Amat->sendProc); if (Amat->sendLeng != NULL ) free (Amat->sendLeng); if (Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++) if (Amat->sendList[i] != NULL) free (Amat->sendList[i]); free (Amat->sendList); } if (Amat->recvProc != NULL) free (Amat->recvProc); if (Amat->recvLeng != NULL) free (Amat->recvLeng); if (Amat->map != NULL) free (Amat->map); free(Amat); } if (link->G_contxt != NULL) free(link->G_contxt); 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)); free(link); 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]; free(diagSize); free(offdiagSize); /* -------------------------------------------------------- */ /* 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); } 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]; free(sendLeng); 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) free(requests); /* ----------------------------------------------------- */ /* 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 */ /* ----------------------------------------------------- */ free(tempCnt); } return 0; #else nprocs = 1; return (nprocs-1); #endif } hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_poly.c000066400000000000000000000204471355566575400213600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; if ( poly_ptr->coefficients != NULL ) free(poly_ptr->coefficients); free(poly_ptr); 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; if ( poly_ptr->coefficients != NULL ) free( poly_ptr->coefficients ); 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]; free( orig_rhs ); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_poly.h000066400000000000000000000026431355566575400213630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_schur.cxx000066400000000000000000001045431355566575400221010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_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_); 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_); 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_); 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); assert( !ierr ); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A11mat_csr); ierr = HYPRE_IJMatrixAssemble(A12mat_); ierr += HYPRE_IJMatrixGetObject(A12mat_, (void **) &A12mat_csr); assert( !ierr ); hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) A12mat_csr); if ( A22mat_ != NULL ) { ierr = HYPRE_IJMatrixAssemble(A22mat_); ierr += HYPRE_IJMatrixGetObject(A22mat_, (void **) &A22mat_csr); 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); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(mpiComm_, V2Start, V2Start+V2Leng-1, &R2vec); HYPRE_IJVectorSetObjectType(R2vec, HYPRE_PARCSR); ierr = HYPRE_IJVectorInitialize(R2vec); ierr += HYPRE_IJVectorAssemble(R2vec); 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_); 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); 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); assert( !ierr ); f1Ind++; } else { ierr = HYPRE_IJVectorSetValues(F2vec, 1, (const int *) &f2Ind, (const double *) &ddata); 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); 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]); assert( !ierr ); V2Cnt++; } else { ierr = HYPRE_IJVectorGetValues(X1vec, 1, &V1Cnt, &xvals[irow-AStart]); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_schur.h000066400000000000000000000056271355566575400215310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_schwarz.c000066400000000000000000001107441355566575400220560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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++ ) free(sch_ptr->bmat_ia[i]); free(sch_ptr->bmat_ia); } if ( sch_ptr->bmat_ja != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) free(sch_ptr->bmat_ja[i]); free(sch_ptr->bmat_ja); } if ( sch_ptr->bmat_aa != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) free(sch_ptr->bmat_aa[i]); free(sch_ptr->bmat_aa); } if ( sch_ptr->aux_bmat_ia != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) free(sch_ptr->aux_bmat_ia[i]); free(sch_ptr->aux_bmat_ia); } if ( sch_ptr->aux_bmat_ja != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) free(sch_ptr->aux_bmat_ja[i]); free(sch_ptr->aux_bmat_ja); } if ( sch_ptr->aux_bmat_aa != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) free(sch_ptr->aux_bmat_aa[i]); free(sch_ptr->aux_bmat_aa); } if ( sch_ptr->blk_sizes != NULL ) free(sch_ptr->blk_sizes); if ( sch_ptr->blk_indices != NULL ) { for ( i = 0; i < sch_ptr->nblocks; i++ ) if ( sch_ptr->blk_indices[i] != NULL ) free( sch_ptr->blk_indices[i] ); } if ( sch_ptr->mh_mat != NULL ) { if (sch_ptr->mh_mat->sendProc != NULL) free(sch_ptr->mh_mat->sendProc); if (sch_ptr->mh_mat->sendLeng != NULL) free(sch_ptr->mh_mat->sendLeng); if (sch_ptr->mh_mat->recvProc != NULL) free(sch_ptr->mh_mat->recvProc); if (sch_ptr->mh_mat->recvLeng != NULL) free(sch_ptr->mh_mat->recvLeng); for ( i = 0; i < sch_ptr->mh_mat->sendProcCnt; i++ ) if (sch_ptr->mh_mat->sendList[i] != NULL) free(sch_ptr->mh_mat->sendList[i]); if (sch_ptr->mh_mat->sendList != NULL) free(sch_ptr->mh_mat->sendList); free( sch_ptr->mh_mat ); } sch_ptr->mh_mat = NULL; free(sch_ptr); 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 */ /* --------------------------------------------------------- */ free(xbuffer); free( idiag ); free( solbuf ); free( dbuffer ); free( context ); 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]; free(parray); free(parray2); } /* --------------------------------------------------------- */ /* 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 */ /* --------------------------------------------------------- */ if ( map != NULL ) free(map); if ( map2 != NULL ) free(map2); if ( int_buf != NULL ) free(int_buf); if ( dble_buf != NULL ) free(dble_buf); if ( recv_lengths != NULL ) free(recv_lengths); free( context->partition ); free( context ); if ( mh_mat->rowptr != NULL ) free( mh_mat->rowptr ); if ( mh_mat->colnum != NULL ) free( mh_mat->colnum ); if ( mh_mat->values != NULL ) free( mh_mat->values ); if ( mh_mat->map != NULL ) free( mh_mat->map ); mh_mat->rowptr = NULL; mh_mat->colnum = NULL; mh_mat->values = NULL; mh_mat->map = NULL; 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]; free( tmp_indices ); } 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]; } free(tmp_blk_leng); } /* --------------------------------------------------------- */ /* 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]); } free( cols ); free( vals ); /* --------------------------------------------------------- */ /* 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; } free( mat_ia ); free( mat_ja ); free( mat_aa ); 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); } } } free( track_array ); free( dble_buf ); free( diagonal ); free( rowNorms ); free( sortcols ); free( sortvals ); return 0; } hypre-2.18.2/src/FEI_mv/fei-hypre/HYPRE_LSI_schwarz.h000066400000000000000000000031441355566575400220560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx000066400000000000000000006612531355566575400223060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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; //} if (AMSData_.EdgeNodeList_ != NULL) delete [] AMSData_.EdgeNodeList_; if (AMSData_.NodeNumbers_ != NULL) delete [] AMSData_.NodeNumbers_; if (AMSData_.NodalCoord_ != NULL) delete [] AMSData_.NodalCoord_; 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]; 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]; 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); //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) delete [] AMSData_.EdgeNodeList_; AMSData_.EdgeNodeList_ = NULL; if (newNumEdges > 0) { AMSData_.numEdges_ = nRows; AMSData_.EdgeNodeList_ = new int[nRows*fieldSize]; 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) delete [] AMSData_.NodeNumbers_; if (AMSData_.NodalCoord_ != NULL) delete [] AMSData_.NodalCoord_; AMSData_.NodeNumbers_ = NULL; AMSData_.NodalCoord_ = NULL; AMSData_.numNodes_ = 0; if (numNodes > 0) { AMSData_.numNodes_ = numNodes; AMSData_.numLocalNodes_ = localEndRow_ - localStartRow_ + 1; AMSData_.NodeNumbers_ = new int[numNodes]; AMSData_.NodalCoord_ = new double[fieldSize*numNodes]; 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); 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); //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); 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) delete [] AMSData_.NodeNumbers_; if (AMSData_.NodalCoord_ != NULL) delete [] AMSData_.NodalCoord_; AMSData_.NodeNumbers_ = NULL; AMSData_.NodalCoord_ = NULL; AMSData_.numNodes_ = auxAMSData->numNodes_; AMSData_.numLocalNodes_ = auxAMSData->numLocalNodes_; if (AMSData_.numNodes_ > 0) { AMSData_.NodeNumbers_ = new int[AMSData_.numNodes_]; AMSData_.NodalCoord_ = new double[AMSData_.numNodes_*mlNumPDEs_]; 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" ) ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYPCG; } else if ( !strcmp(name, "lsicg" ) ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYLSICG; } else if ( !strcmp(name, "hybrid") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYHYBRID; } else if ( !strcmp(name, "gmres") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYGMRES; } else if ( !strcmp(name, "fgmres") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYFGMRES; } else if ( !strcmp(name, "bicgstab") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYCGSTAB; } else if ( !strcmp(name, "bicgstabl") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYCGSTABL; } else if ( !strcmp(name, "tfqmr") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYTFQMR; } else if ( !strcmp(name, "bicgs") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYBICGS; } else if ( !strcmp(name, "symqmr") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYSYMQMR; } else if ( !strcmp(name, "boomeramg") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYAMG; } else if ( !strcmp(name, "superlu") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYSUPERLU; } else if ( !strcmp(name, "superlux") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYSUPERLUX; } else if ( !strcmp(name, "dsuperlu") ) { 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") ) { strcpy( HYSolverName_, name ); HYSolverID_ = HYY12M; } else if ( !strcmp(name, "amge") ) { 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")) { strcpy(HYPreconName_, name); HYPreconID_ = HYIDENTITY; } else if (!strcmp(name, "diagonal")) { strcpy(HYPreconName_, name); HYPreconID_ = HYDIAGONAL; } else if (!strcmp(name, "pilut")) { strcpy(HYPreconName_, name); HYPreconID_ = HYPILUT; } else if (!strcmp(name, "parasails")) { strcpy(HYPreconName_, name); HYPreconID_ = HYPARASAILS; } else if (!strcmp(name, "boomeramg")) { strcpy(HYPreconName_, name); HYPreconID_ = HYBOOMERAMG; } else if (!strcmp(name, "ddilut")) { strcpy(HYPreconName_, name); HYPreconID_ = HYDDILUT; } else if (!strcmp(name, "schwarz")) { strcpy(HYPreconName_, name); HYPreconID_ = HYSCHWARZ; } else if (!strcmp(name, "ddict")) { strcpy(HYPreconName_, name); HYPreconID_ = HYDDICT; } else if (!strcmp(name, "poly")) { strcpy(HYPreconName_, name); HYPreconID_ = HYPOLY; } else if (!strcmp(name, "euclid")) { strcpy(HYPreconName_, name); HYPreconID_ = HYEUCLID; } else if (!strcmp(name, "blockP")) { strcpy(HYPreconName_, name); HYPreconID_ = HYBLOCK; } else if (!strcmp(name, "ml")) { #ifdef HAVE_ML 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 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 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")) { strcpy(HYPreconName_, name); HYPreconID_ = HYAMS; } else if (!strcmp(name, "uzawa")) { strcpy(HYPreconName_, name); HYPreconID_ = HYUZAWA; } #ifdef HAVE_SYSPDE else if (!strcmp(name, "syspde")) { strcpy(HYPreconName_, name); HYPreconID_ = HYSYSPDE; } #endif #ifdef HYPRE_USING_DSUPERLU else if (!strcmp(name, "dsuperlu")) { 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; 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; //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.18.2/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.h000066400000000000000000000751531355566575400217310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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 { int *EdgeNodeList_; int *NodeNumbers_; int numEdges_; int numLocalNodes_; int numNodes_; double *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.18.2/src/FEI_mv/fei-hypre/HYPRE_MHMatrix.h000066400000000000000000000032241355566575400213560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_MLMatrix.h000066400000000000000000000017101355566575400213600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_MLMaxwell.h000066400000000000000000000030601355566575400215250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_SlideReduction.cxx000066400000000000000000006033201355566575400231600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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_); 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); 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_); 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); 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_); 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); 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_); 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_); 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); 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); 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; assert( !ierr ); } } ierr = HYPRE_IJMatrixSetRowSizes(reducedAmat_, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedAmat_); 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); 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); 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); 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; } } assert( vecIndex >= startRow ); 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_); 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_); 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_); 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); 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; } } assert( searchIndex >= startRow ); 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); 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); 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); 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_); 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]); } } } } 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); assert( !ierr ); newRowSize = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); 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_); 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); 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); 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); 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); 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); 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)); 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); 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_); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); assert( !ierr ); newRowSize = rowSize; HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) hypreC,rowIndex, &rowSize,&colInd,&colVal); ierr = HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) hypreCBC,rowIndex, &rowSize,&colInd,&colVal); 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_); 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); 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); 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); 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); 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); 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); 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); 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; assert( !ierr ); rowCount++; } } ierr = HYPRE_IJMatrixSetRowSizes(reducedAmat_, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedAmat_); 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); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_SlideReduction.h000066400000000000000000000063571355566575400226140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_fei_matrix.cxx000066400000000000000000000052251355566575400223720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_fei_mesh.cxx000066400000000000000000000454521355566575400220300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_fei_mv.h000066400000000000000000000121621355566575400211330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_fei_vector.cxx000066400000000000000000000103571355566575400223720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_TFQmr.c000066400000000000000000000135161355566575400222300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_TFQmr.h000066400000000000000000000040151355566575400222270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgs.c000066400000000000000000000117131355566575400223230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgs.h000066400000000000000000000040211355566575400223220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgstabl.c000066400000000000000000000145311355566575400231670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_bicgstabl.h000066400000000000000000000042141355566575400231710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_fgmres.c000066400000000000000000000155301355566575400225200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_fgmres.h000066400000000000000000000042051355566575400225220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_lsicg.c000066400000000000000000000134371355566575400223420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_lsicg.h000066400000000000000000000037661355566575400223530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_maxwell.c000066400000000000000000000165751355566575400227200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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]; free(submatrices); 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_superlu.c000066400000000000000000000245371355566575400227430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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); 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; assert ( sluPtr != NULL ); if ( sluPtr->permR_ != NULL ) free(sluPtr->permR_); if ( sluPtr->permC_ != NULL ) free(sluPtr->permC_); free(sluPtr); 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; 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; assert ( sluPtr != NULL ); HYPRE_ParCSRMatrixGetRowPartitioning( A_csr, &partition ); startRow = partition[0]; endRow = partition[1] - 1; nrows = endRow - startRow + 1; free( partition ); 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; } free(colLengs); /* ---------------------------------------------------------------- */ /* 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); free(etree); 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 */ /* ---------------------------------------------------------------- */ 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_superlu.h000066400000000000000000000025421355566575400227400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_symqmr.c000066400000000000000000000135321355566575400225650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/fei-hypre/HYPRE_parcsr_symqmr.h000066400000000000000000000040311355566575400225640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI.doc000066400000000000000000000504551355566575400204700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Fei.cxx000066400000000000000000003632221355566575400213070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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(); 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Fei.h000066400000000000000000000152241355566575400207300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Impl.cxx000066400000000000000000000174031355566575400215020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Impl.h000066400000000000000000000126421355566575400211270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_LSCore.cxx000066400000000000000000000140651355566575400217310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_LSCore.h000066400000000000000000000044761355566575400213630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Matrix.cxx000066400000000000000000001313171355566575400220460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Matrix.h000066400000000000000000000075141355566575400214740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Solver.cxx000066400000000000000000001271461355566575400220610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/LLNL_FEI_Solver.h000066400000000000000000000040471355566575400215000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/Makefile000066400000000000000000000122531355566575400202070ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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_mv\ -I$(srcdir)/../../parcsr_ls\ -I$(srcdir)/../../seq_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_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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/FEI_mv/fei-hypre/SymQMR.c000066400000000000000000000314211355566575400200410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/TFQmr.c000066400000000000000000000353411355566575400177070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/_hypre_FEI.h000066400000000000000000000104331355566575400206670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/bicgs.c000066400000000000000000000317441355566575400200100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/FEI_mv/fei-hypre/bicgstabl.c000066400000000000000000001102111355566575400206360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/cfei-hypre.h000066400000000000000000000010141355566575400207440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/cfei_hypre.cxx000066400000000000000000000434011355566575400214070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/fei-hypre/cfei_hypre.h000066400000000000000000000100541355566575400210320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/driver.C000066400000000000000000000363121355566575400201500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/driver.cxx000066400000000000000000000362771355566575400206020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/fei-hypre/fei_mv.h000066400000000000000000000335631355566575400201740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/FEI_mv/fei-hypre/fgmres.c000066400000000000000000000406561355566575400202060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/FEI_mv/fei-hypre/hypre_cfei.cxx000066400000000000000000000371471355566575400214210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/fei-hypre/hypre_cfei.h000066400000000000000000000066761355566575400210510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/hypre_lsi_amge.c000066400000000000000000000604631355566575400217100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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"); if ( i_element_node_0 != NULL ) free( i_element_node_0 ); if ( j_element_node_0 != NULL ) free( j_element_node_0 ); if ( i_dof_on_boundary != NULL ) free( i_dof_on_boundary ); if ( temp_elem_node_cnt != NULL ) free( temp_elem_node_cnt ); for ( i = 0; i < num_elements; i++ ) { if ( temp_elem_node[i] != NULL ) free( temp_elem_node[i] ); if ( temp_elem_data[i] != NULL ) free( temp_elem_data[i] ); } 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]; free(temp_elem_data[i]); } free(temp_elem_data); 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]; free(temp_elem_node[i]); } i_element_node_0[num_elements] = counter; free(temp_elem_node); 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); free(i_node_on_boundary); 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); free(element_data); 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.18.2/src/FEI_mv/fei-hypre/hypre_lsi_ddamg.c000066400000000000000000001334331355566575400220510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 #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); free( temp_list ); free( temp_vect ); /* --------------------------------------------------------*/ /* 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); free( temp_list ); free( temp_vect ); /* --------------------------------------------------------*/ /* 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); free( temp_list ); free( temp_vect ); /* --------------------------------------------------------*/ /* 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); free( temp_list ); free( temp_vect ); /* --------------------------------------------------------*/ /* 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); free( temp_list ); free( temp_vect ); /* --------------------------------------------------------*/ /* 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++; } } free( newColInd ); free( newColVal ); 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; free( itemp_vec ); free( itemp_vec2 ); 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.18.2/src/FEI_mv/fei-hypre/hypre_lsi_misc.c000066400000000000000000000535231355566575400217310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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); 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++; } free( colInd2 ); free( colVal2 ); ia_ptr[i+1] = nz_ptr; ierr = HYPRE_ParCSRMatrixRestoreRow(A_csr,i,&rowSize,&colInd,&colVal); 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]; } free( darray1 ); free( iarray1 ); 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]; free( ia2 ); free( ja2 ); free( aa2 ); free( nz_array ); free( tag_array ); free( queue ); 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); free( localLabels ); (*nLabels) = 0; (*labels) = NULL; } else { printf("HYPRE_LSI_PartitionMatrix : number of labels = %d.\n", labelNum); (*labels) = localLabels; } free( indSet ); return 0; } hypre-2.18.2/src/FEI_mv/fei-hypre/hypre_schur_reduce.cxx000066400000000000000000002430571355566575400231650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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); 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); 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); 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); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); 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); 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); 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); 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); 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_); 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_); 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_); 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); 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); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr = HYPRE_IJVectorAssemble(f2hat); 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); 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); 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); 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); 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); 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); 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); assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm_, CTStartRow, CTStartRow+CTNRows-1, CStartRow, CStartRow+CTNCols-1, &CTmat); ierr += HYPRE_IJMatrixSetObjectType(Mmat, HYPRE_PARCSR); 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); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(comm_, CStartRow, CStartRow+CNRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); 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); 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); 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); 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); 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_); 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_); 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_); 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.18.2/src/FEI_mv/fei-hypre/hypre_slide_reduce.cxx000066400000000000000000004065211355566575400231360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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; assert( !ierr ); rowCount++; } } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(reducedA, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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; assert( !ierr ); rowCount++; } else { reducedAMatSize[rowIndex++] = 1; rowCount++; } } //------------------------------------------------------------------ // create a matrix context for reducedA //------------------------------------------------------------------ ierr = HYPRE_IJMatrixSetRowSizes(reducedA, reducedAMatSize); ierr += HYPRE_IJMatrixInitialize(reducedA); 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); 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); 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); assert(!ierr); HYPRE_IJVectorCreate(comm_, A21StartRow, A21StartRow+A21NRows-1, &f2hat); HYPRE_IJVectorSetObjectType(f2hat, HYPRE_PARCSR); ierr += HYPRE_IJVectorInitialize(f2hat); ierr += HYPRE_IJVectorAssemble(f2hat); 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); 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); 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); 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); 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); assert(!ierr); rowCount++; delete [] newColInd; delete [] newColVal; } } //------------------------------------------------------------------ // assemble the A12 matrix //------------------------------------------------------------------ ierr = HYPRE_IJMatrixAssemble(A12); 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); 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); 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.18.2/src/FEI_mv/fei-hypre/lsicg.c000066400000000000000000000261011355566575400200110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/fei-hypre/ml_maxwell.cxx000066400000000000000000000237661355566575400214470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/femli/000077500000000000000000000000001355566575400157505ustar00rootroot00000000000000hypre-2.18.2/src/FEI_mv/femli/CMakeLists.txt000066400000000000000000000021421355566575400205070ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/Makefile000066400000000000000000000065351355566575400174210ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../../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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/FEI_mv/femli/Usage_amgs000066400000000000000000000036221355566575400177510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/Usage_solver000066400000000000000000000015541355566575400203360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/cmli.cxx000066400000000000000000000616251355566575400174320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/cmli.h000066400000000000000000000167061355566575400170570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/driver_fedata.cxx000066400000000000000000000623751355566575400213100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/driver_matrix.cxx000066400000000000000000000210331355566575400213520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/driver_util.c000066400000000000000000000123531355566575400204500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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]); free(matrix); free(evectors); free(evalues); free(daux1); free(daux2); } /****************************************************************************** * 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++ ) { free( list[i] ); free( list2[i] ); } free( checkList ); */ free( listLengs ); free( list ); free( list2 ); free( newList ); } hypre-2.18.2/src/FEI_mv/femli/genTecPlot.c000066400000000000000000000063541355566575400201700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli.cxx000066400000000000000000000400311355566575400172530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli.h000066400000000000000000000074171355566575400167130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_amgsa_calib.cxx000066400000000000000000000347421355566575400215710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/femli/mli_amgsa_coarsen1.cxx000066400000000000000000002057661355566575400222400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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); 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); 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); 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); assert( !ierr ); HYPRE_IJMatrixGetObject(IJPmat, (void **) &Pmat2); HYPRE_IJMatrixSetObjectType(IJPmat, -1); HYPRE_IJMatrixDestroy( IJPmat ); delete [] colInd; delete [] colVal; Pmat = hypre_ParMatmul( Jmat, Pmat2); hypre_ParCSRMatrixOwnsRowStarts(Jmat) = 0; hypre_ParCSRMatrixOwnsColStarts(Pmat2) = 0; 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); assert(!ierr); rowLengths = new int[PLocalNRows]; for (irow = 0; irow < PLocalNRows; irow++) rowLengths[irow] = nullspaceDim_; ierr = HYPRE_IJMatrixSetRowSizes(IJPmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJPmat); 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); 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 *-----------------------------------------------------------------*/ 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); 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); 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); 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 *-----------------------------------------------------------------*/ 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); 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); 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); 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 #include // ********************************************************************* // 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]; assert( ((long) csrJA) ); csrAA = new double[csrNrows*rowSize]; 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)]; 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.18.2/src/FEI_mv/femli/mli_amgsa_dd_sfei.cxx000066400000000000000000003600561355566575400221140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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) 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]; assert( csrJA != NULL ); csrAA = new double[csrNrows*rowSize]; 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)]; 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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.18.2/src/FEI_mv/femli/mli_amgsa_elem.cxx000066400000000000000000000322561355566575400214370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/FEI_mv/femli/mli_defs.h000066400000000000000000000016111355566575400177020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_febase.cxx000066400000000000000000001031331355566575400205630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_febase.h000066400000000000000000000240031355566575400202060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_fedata.cxx000066400000000000000000004646331355566575400206010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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_; 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++ ) { 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.18.2/src/FEI_mv/femli/mli_fedata.h000066400000000000000000000333401355566575400202110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_fedata_utils.cxx000066400000000000000000001352441355566575400220120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_fedata_utils.h000066400000000000000000000031311355566575400214240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_festruct.h000066400000000000000000001205511355566575400206250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_mapper.cxx000066400000000000000000000105071355566575400206240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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.18.2/src/FEI_mv/femli/mli_mapper.h000066400000000000000000000026351355566575400202540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_matrix.cxx000066400000000000000000000312631355566575400206460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.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); 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.18.2/src/FEI_mv/femli/mli_matrix.h000066400000000000000000000043161355566575400202720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_matrix_misc.h000066400000000000000000000026161355566575400213060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_matrix_mult.cxx000066400000000000000000001011071355566575400217020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.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.18.2/src/FEI_mv/femli/mli_matrix_utils.cxx000066400000000000000000000416451355566575400220730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "_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.18.2/src/FEI_mv/femli/mli_method.cxx000066400000000000000000000173141355566575400206230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_method.h000066400000000000000000000036031355566575400202440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_method_amgcr.cxx000066400000000000000000001752001355566575400217730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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 *rowStarts, *newRowStarts, *colStarts, *newColStarts; 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); assert(!ierr); rowLengs = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJPFF, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFF); assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, CStartRow,CStartRow+CNRows-1, &IJPFC); ierr = HYPRE_IJMatrixSetObjectType(IJPFC, HYPRE_PARCSR); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJPFC, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFC); 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); 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); 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); rowStarts = hypre_ParCSRMatrixRowStarts(hyprePFFT); newRowStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newRowStarts[irow] = rowStarts[irow]; hypre_ParCSRMatrixRowStarts(hypreAfc) = newRowStarts; colStarts = hypre_ParCSRMatrixColStarts(hypreAPFC); newColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newColStarts[irow] = colStarts[irow]; hypre_ParCSRMatrixColStarts(hypreAfc) = newColStarts; hypre_ParCSRMatrixOwnsRowStarts(hypreAfc) = 1; hypre_ParCSRMatrixOwnsColStarts(hypreAfc) = 1; hypre_ParCSRMatrixOwnsColStarts(hyprePFF) = 0; 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(); colStarts = hypre_ParCSRMatrixColStarts(hyprePFF); newColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newColStarts[irow] = colStarts[irow]; hypre_ParCSRMatrixColStarts(hypreAff) = newColStarts; newColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newColStarts[irow] = colStarts[irow]; hypre_ParCSRMatrixRowStarts(hypreAff) = newColStarts; 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, *rowStarts; int *newRowStarts, 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); assert(!ierr); rowLengs = new int[AffNRows]; for (irow = 0; irow < AffNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJInvD, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJInvD); 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); assert( !ierr ); HYPRE_IJMatrixGetObject(IJInvD, (void **) &hypreInvD); ierr += HYPRE_IJMatrixSetObjectType(IJInvD, -1); ierr += HYPRE_IJMatrixDestroy(IJInvD); 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]; } } hypre_ParCSRMatrixOwnsColStarts(hypreInvD) = 0; rowStarts = hypre_ParCSRMatrixRowStarts(hypreA); newRowStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newRowStarts[irow] = rowStarts[irow]; hypre_ParCSRMatrixRowStarts(hypreP) = newRowStarts; #else ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); 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); 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); assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreAD); hypreP = hypre_ParMatmul(hypreAD, hypreInvD); hypre_ParCSRMatrixOwnsRowStarts(hypreP) = 1; hypre_ParCSRMatrixOwnsRowStarts(hypreAD) = 0; 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); 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); 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; assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); 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_ParCSRMatrixOwnsRowStarts(hypreP) = 0; hypre_ParCSRMatrixOwnsColStarts(hypreAfc) = 0; hypre_ParCSRMatrixOwnsRowStarts(hypreTmp) = 1; hypre_ParCSRMatrixOwnsColStarts(hypreTmp) = 1; 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); 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); 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); assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); hypre_ParCSRMatrixDestroy(hypreP); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); 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); assert(!ierr); rowLengs = new int[RNRows]; for (irow = 0; irow < RNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJR, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJR); 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); assert(!ierr); HYPRE_IJMatrixGetObject(IJR, (void **) &hypreR); ierr += HYPRE_IJMatrixSetObjectType(IJR, -1); ierr += HYPRE_IJMatrixDestroy(IJR); 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.18.2/src/FEI_mv/femli/mli_method_amgcr.h000066400000000000000000000041351355566575400214160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_method_amgrs.cxx000066400000000000000000002152261355566575400220160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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, 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); 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); assert(!ierr); rowLengs = new int[localNCols]; for ( k = 0; k < localNCols; k++ ) rowLengs[k] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJRmat, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJRmat); 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); 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); hypreRT->owns_col_starts = 0; 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); //if (hypre_ParCSRMatrixOwnsRowStarts(hypreCA) == 0) //{ // rowColStarts = hypre_ParCSRMatrixRowStarts(hypreR); // newRowColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); // for (irow = 0; irow <= nprocs; irow++) // newRowColStarts[irow] = rowColStarts[irow]; // hypre_ParCSRMatrixRowStarts(hypreCA) = newRowColStarts; // hypre_ParCSRMatrixOwnsRowStarts(hypreCA) = 1; //} //if (hypre_ParCSRMatrixOwnsColStarts(hypreCA) == 0) //{ // rowColStarts = hypre_ParCSRMatrixColStarts(hypreAP); // newRowColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); // for (irow = 0; irow <= nprocs; irow++) // newRowColStarts[irow] = rowColStarts[irow]; // hypre_ParCSRMatrixColStarts(hypreCA) = newRowColStarts; // hypre_ParCSRMatrixOwnsColStarts(hypreCA) = 1; //} //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 *rowStarts, *newRowStarts, *colStarts, *newColStarts, 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); assert(!ierr); rowLengs = new int[localNRows]; for (irow = 0; irow < localNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJPFF, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFF); assert(!ierr); ierr = HYPRE_IJMatrixCreate(comm,startRow,startRow+localNRows-1, CStartRow,CStartRow+CNRows-1, &IJPFC); ierr = HYPRE_IJMatrixSetObjectType(IJPFC, HYPRE_PARCSR); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJPFC, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJPFC); 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); 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); 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); rowStarts = hypre_ParCSRMatrixRowStarts(hyprePFFT); newRowStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newRowStarts[irow] = rowStarts[irow]; hypre_ParCSRMatrixRowStarts(hypreAfc) = newRowStarts; colStarts = hypre_ParCSRMatrixColStarts(hypreAPFC); newColStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newColStarts[irow] = colStarts[irow]; hypre_ParCSRMatrixColStarts(hypreAfc) = newColStarts; hypre_ParCSRMatrixOwnsRowStarts(hypreAfc) = 1; hypre_ParCSRMatrixOwnsColStarts(hypreAfc) = 1; 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(); hypre_ParCSRMatrixOwnsRowStarts(hyprePFF) = 0; hypre_ParCSRMatrixOwnsColStarts(hyprePFF) = 0; //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); assert(!ierr); rowLengs = new int[AffNRows]; for (irow = 0; irow < AffNRows; irow++) rowLengs[irow] = 1; ierr = HYPRE_IJMatrixSetRowSizes(IJInvD, rowLengs); ierr = HYPRE_IJMatrixInitialize(IJInvD); 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); assert( !ierr ); HYPRE_IJMatrixGetObject(IJInvD, (void **) &hypreInvD); ierr += HYPRE_IJMatrixSetObjectType(IJInvD, -1); ierr += HYPRE_IJMatrixDestroy(IJInvD); 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]; } } hypre_ParCSRMatrixOwnsColStarts(hypreInvD) = 0; rowStarts = hypre_ParCSRMatrixRowStarts(hypreA); newRowStarts = hypre_TAlloc(int, (nprocs+1) , HYPRE_MEMORY_HOST); for (irow = 0; irow <= nprocs; irow++) newRowStarts[irow] = rowStarts[irow]; hypre_ParCSRMatrixRowStarts(hypreP) = newRowStarts; #else ierr = HYPRE_IJMatrixCreate(comm,AffStartRow,AffStartRow+AffNRows-1, AffStartRow,AffStartRow+AffNRows-1,&IJP); ierr = HYPRE_IJMatrixSetObjectType(IJP, HYPRE_PARCSR); 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); 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); assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreAD); hypreP = hypre_ParMatmul(hypreAD, hypreInvD); hypre_ParCSRMatrixOwnsRowStarts(hypreP) = 1; hypre_ParCSRMatrixOwnsRowStarts(hypreAD) = 0; 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); 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); 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; assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); 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_ParCSRMatrixOwnsRowStarts(hypreP) = 0; hypre_ParCSRMatrixOwnsColStarts(hypreAfc) = 0; hypre_ParCSRMatrixOwnsRowStarts(hypreTmp) = 1; hypre_ParCSRMatrixOwnsColStarts(hypreTmp) = 1; 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); 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); 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); assert(!ierr); } delete [] newColInd; delete [] newColVal; ierr = HYPRE_IJMatrixAssemble(IJP); assert( !ierr ); hypre_ParCSRMatrixDestroy(hypreP); HYPRE_IJMatrixGetObject(IJP, (void **) &hypreP); ierr += HYPRE_IJMatrixSetObjectType(IJP, -1); ierr += HYPRE_IJMatrixDestroy(IJP); 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.18.2/src/FEI_mv/femli/mli_method_amgrs.h000066400000000000000000000072061355566575400214400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_method_amgsa.cxx000066400000000000000000001720641355566575400217770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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);assert2(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);assert2(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.18.2/src/FEI_mv/femli/mli_method_amgsa.h000066400000000000000000000162121355566575400214140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_olapdd.c000066400000000000000000000242231355566575400202230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/FEI_mv/femli/mli_oneLevel.cxx000066400000000000000000000266041355566575400211160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_oneLevel.h000066400000000000000000000073611355566575400205420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_sfei.cxx000066400000000000000000000224071355566575400202700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_sfei.h000066400000000000000000000031241355566575400177100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver.cxx000066400000000000000000000173301355566575400206530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver.h000066400000000000000000000047751355566575400203110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_amg.cxx000066400000000000000000000063241355566575400215000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_amg.h000066400000000000000000000020271355566575400211210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_arpacksuperlu.cxx000066400000000000000000000220421355566575400236100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_arpacksuperlu.h000066400000000000000000000026311355566575400232370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_bjacobi.cxx000066400000000000000000001007011355566575400223170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_bjacobi.h000066400000000000000000000031321355566575400217440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_bsgs.cxx000066400000000000000000001213011355566575400216630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_bsgs.h000066400000000000000000000032501355566575400213120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_cg.cxx000066400000000000000000000502161355566575400213240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_cg.h000066400000000000000000000030701355566575400207450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_chebyshev.cxx000066400000000000000000000156421355566575400227170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_chebyshev.h000066400000000000000000000023241355566575400223350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_gmres.cxx000066400000000000000000000310421355566575400220440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_gmres.h000066400000000000000000000022531355566575400214730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_gs.cxx000066400000000000000000000243231355566575400213440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_gs.h000066400000000000000000000022331355566575400207650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_hschwarz.cxx000066400000000000000000000131531355566575400225630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_hschwarz.h000066400000000000000000000023651355566575400222130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_hsgs.cxx000066400000000000000000000135171355566575400217020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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); hypre_ParVectorSetPartitioningOwner(zTemp,0); } //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.18.2/src/FEI_mv/femli/mli_solver_hsgs.h000066400000000000000000000024071355566575400213230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_jacobi.cxx000066400000000000000000000331461355566575400221650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_jacobi.h000066400000000000000000000026761355566575400216160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_kaczmarz.cxx000066400000000000000000000201111355566575400225440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_kaczmarz.h000066400000000000000000000021731355566575400222010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_mli.cxx000066400000000000000000000050021355566575400215050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_mli.h000066400000000000000000000020301355566575400211300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_mls.cxx000066400000000000000000000270571355566575400215350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_mls.h000066400000000000000000000026101355566575400211460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_parasails.cxx000066400000000000000000000420701355566575400227110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_parasails.h000066400000000000000000000036301355566575400223350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_seqsuperlu.cxx000066400000000000000000001027611355566575400231460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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.18.2/src/FEI_mv/femli/mli_solver_seqsuperlu.h000066400000000000000000000033451355566575400225710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_sgs.cxx000066400000000000000000000561731355566575400215370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/FEI_mv/femli/mli_solver_sgs.h000066400000000000000000000026221355566575400211520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_superlu.cxx000066400000000000000000000273411355566575400224350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_solver_superlu.h000066400000000000000000000024251355566575400220560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_utils.c000066400000000000000000003170031355566575400201210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); 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); 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; free( newColInd ); free( newColVal ); free( rowLengths ); free( rowPart ); 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]; free( partition ); /* ----------------------------------------------------------------- * 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); 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 ); } free(alphaArray); free(rnormArray); for (i = 0; i <= maxIter; i++) if ( Tmat[i] != NULL ) free( Tmat[i] ); free(Tmat); free(srdiag); 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]; free( rowPart ); 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]; free( partition ); 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; free( partition ); 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); 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); 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); free( newInd ); free( newVal ); free( newVal2 ); } ierr = HYPRE_IJMatrixAssemble(IJAmat2); assert( !ierr ); HYPRE_IJMatrixGetObject(IJAmat2, (void **) &hypreA2); /*hypre_MatvecCommPkgCreate((hypre_ParCSRMatrix *) hypreA2);*/ HYPRE_IJMatrixSetObjectType( IJAmat2, -1 ); HYPRE_IJMatrixDestroy( IJAmat2 ); if ( rowLengths != NULL ) free( rowLengths ); (*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; free( partition ); 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); 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); assert(!ierr); if ( rowLengths != NULL ) free( rowLengths ); /* ---------------------------------------------------------------- * 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); } } if ( newInd != NULL ) free( newInd ); if ( newVal != NULL ) free( newVal ); if ( sInd != NULL ) free( sInd ); ierr = HYPRE_IJMatrixAssemble(IJSmat2); 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); free(workArray); free(sArray); #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 ); } free(alphaArray); free(rnormArray); for (i = 0; i <= maxIter; i++) if ( Tmat[i] != NULL ) free( Tmat[i] ); free(Tmat); 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]; } free( tempJA ); free( tempAA ); } 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); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); 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); assert( !ierr ); } free( rowLengths ); free( matIA ); free( matJA ); free( matAA ); ierr = HYPRE_IJMatrixAssemble(IJmat); 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]; free( diag ); } (*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); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); 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); assert( !ierr ); } free( rowLengths ); free( matIA ); free( matJA ); free( matAA ); ierr = HYPRE_IJMatrixAssemble(IJmat); 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]; free( diag ); } (*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]; } free( rowsArray ); 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); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); 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); assert( !ierr ); } free( rowLengths ); free( matIA ); free( matJA ); free( matAA ); ierr = HYPRE_IJMatrixAssemble(IJmat); assert( !ierr ); HYPRE_IJMatrixGetObject(IJmat, (void**) &hypreA); HYPRE_IJMatrixSetObjectType(IJmat, -1); HYPRE_IJMatrixDestroy(IJmat); (*Amat) = (void *) hypreA; if ( scaleFlag == 1 ) { free( diag ); diag = hypre_TAlloc(double, localNRows, HYPRE_MEMORY_HOST); for ( irow = 0; irow < localNRows; irow++ ) diag[irow] = diag2[startRow+irow]; free( diag2 ); } (*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); assert(!ierr); ierr = HYPRE_IJMatrixSetRowSizes(IJmat, rowLengths); ierr = HYPRE_IJMatrixInitialize(IJmat); 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); assert( !ierr ); } free(rowLengths); free(matIA); free(matJA); free(matAA); ierr = HYPRE_IJMatrixAssemble(IJmat); 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; if (jacobiPtr->diagonal_ != NULL) free(jacobiPtr->diagonal_); 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; if (jacobiPtr->diagonal_ != NULL) free(jacobiPtr->diagonal_); 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; free( indices ); free( tree ); free( treeInd ); 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.18.2/src/FEI_mv/femli/mli_utils.h000066400000000000000000000123401355566575400201220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_utils_fortran.f000066400000000000000000000520351355566575400216600ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/FEI_mv/femli/mli_vector.cxx000066400000000000000000000133411355566575400206410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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; hypre_ParVectorOwnsPartitioning(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.18.2/src/FEI_mv/femli/mli_vector.h000066400000000000000000000027571355566575400202770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/HYPRE.h000066400000000000000000000024071355566575400146120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/HYPREf.h000066400000000000000000000027221355566575400147600ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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 ) hypre-2.18.2/src/IJ_mv/000077500000000000000000000000001355566575400145535ustar00rootroot00000000000000hypre-2.18.2/src/IJ_mv/CMakeLists.txt000066400000000000000000000012461355566575400173160ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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_IJ_mv.h _hypre_IJ_mv.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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/IJ_mv/F90_HYPRE_IJMatrix.c000066400000000000000000000265441355566575400200060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/IJ_mv/F90_HYPRE_IJVector.c000066400000000000000000000205261355566575400177760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/IJ_mv/F90_IJMatrix.c000066400000000000000000000022501355566575400170230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/IJ_mv/HYPRE_IJMatrix.c000066400000000000000000000755641355566575400173760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *row_partitioning; HYPRE_BigInt *col_partitioning; HYPRE_BigInt *info; HYPRE_Int num_procs; HYPRE_Int myid; hypre_IJMatrix *ijmatrix; #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt row0, col0, rowN, colN; #else HYPRE_BigInt *recv_buf; HYPRE_Int i, i4; HYPRE_Int square; #endif 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION info = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); row_partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); col_partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); row_partitioning[0] = ilower; row_partitioning[1] = iupper+1; col_partitioning[0] = jlower; col_partitioning[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; hypre_TFree(info, HYPRE_MEMORY_HOST); #else info = hypre_CTAlloc(HYPRE_BigInt, 4, HYPRE_MEMORY_HOST); recv_buf = hypre_CTAlloc(HYPRE_BigInt, 4*num_procs, HYPRE_MEMORY_HOST); row_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); info[0] = ilower; info[1] = iupper; info[2] = jlower; info[3] = jupper; /* Generate row- and column-partitioning through information exchange across all processors, check whether the matrix is square, and if the partitionings match. i.e. no overlaps or gaps, if there are overlaps or gaps in the row partitioning or column partitioning , ierr will be set to -9 or -10, respectively */ hypre_MPI_Allgather(info,4,HYPRE_MPI_BIG_INT,recv_buf,4,HYPRE_MPI_BIG_INT,comm); row_partitioning[0] = recv_buf[0]; square = 1; for (i=0; i < num_procs-1; i++) { i4 = 4*i; if ( recv_buf[i4+1] != (recv_buf[i4+4]-1) ) { hypre_error(HYPRE_ERROR_GENERIC); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(row_partitioning, HYPRE_MEMORY_HOST); return hypre_error_flag; } else { row_partitioning[i+1] = recv_buf[i4+4]; } if ((square && (recv_buf[i4] != recv_buf[i4+2])) || (recv_buf[i4+1] != recv_buf[i4+3]) ) { square = 0; } } i4 = (num_procs-1)*4; row_partitioning[num_procs] = recv_buf[i4+1]+1; if ((recv_buf[i4] != recv_buf[i4+2]) || (recv_buf[i4+1] != recv_buf[i4+3])) { square = 0; } if (square) { col_partitioning = row_partitioning; } else { col_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); col_partitioning[0] = recv_buf[2]; for (i=0; i < num_procs-1; i++) { i4 = 4*i; if (recv_buf[i4+3] != recv_buf[i4+6]-1) { hypre_error(HYPRE_ERROR_GENERIC); hypre_TFree(ijmatrix, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(row_partitioning, HYPRE_MEMORY_HOST); hypre_TFree(col_partitioning, HYPRE_MEMORY_HOST); return hypre_error_flag; } else { col_partitioning[i+1] = recv_buf[i4+6]; } } col_partitioning[num_procs] = recv_buf[num_procs*4-1]+1; } hypre_IJMatrixGlobalFirstRow(ijmatrix) = row_partitioning[0]; hypre_IJMatrixGlobalFirstCol(ijmatrix) = col_partitioning[0]; hypre_IJMatrixGlobalNumRows(ijmatrix) = row_partitioning[num_procs] - row_partitioning[0]; hypre_IJMatrixGlobalNumCols(ijmatrix) = col_partitioning[num_procs] - col_partitioning[0]; hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); #endif hypre_IJMatrixRowPartitioning(ijmatrix) = row_partitioning; hypre_IJMatrixColPartitioning(ijmatrix) = col_partitioning; *matrix = (HYPRE_IJMatrix) ijmatrix; 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_IJMatrixRowPartitioning(ijmatrix) == hypre_IJMatrixColPartitioning(ijmatrix)) { hypre_TFree(hypre_IJMatrixRowPartitioning(ijmatrix), HYPRE_MEMORY_HOST); } else { hypre_TFree(hypre_IJMatrixRowPartitioning(ijmatrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_IJMatrixColPartitioning(ijmatrix), HYPRE_MEMORY_HOST); } 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_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) = 1; 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[0] = 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; HYPRE_Int *row_indexes; 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; } /* Compute row_indexes and call Values2 routine (TODO: add OpenMP)*/ row_indexes = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); hypre_PrefixSumInt(nrows, ncols, row_indexes); HYPRE_IJMatrixSetValues2(matrix, nrows, ncols, rows, row_indexes, cols, values); hypre_TFree(row_indexes, HYPRE_MEMORY_HOST); 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; HYPRE_Int *row_indexes; 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; } /* Compute row_indexes and call Values2 routine */ row_indexes = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); hypre_PrefixSumInt(nrows, ncols, row_indexes); HYPRE_IJMatrixAddToValues2(matrix, nrows, ncols, rows, row_indexes, cols, values); hypre_TFree(row_indexes, HYPRE_MEMORY_HOST); 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 (!row_indexes) { hypre_error_in_arg(5); 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 (hypre_IJMatrixOMPFlag(ijmatrix)) { hypre_IJMatrixSetValuesOMPParCSR(ijmatrix, nrows, ncols, rows, row_indexes, cols, values); } else { hypre_IJMatrixSetValuesParCSR(ijmatrix, nrows, ncols, rows, row_indexes, 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 (!row_indexes) { hypre_error_in_arg(5); 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 (hypre_IJMatrixOMPFlag(ijmatrix)) { hypre_IJMatrixAddToValuesOMPParCSR(ijmatrix, nrows, ncols, rows, row_indexes, cols, values); } else { hypre_IJMatrixAddToValuesParCSR(ijmatrix, nrows, ncols, rows, row_indexes, cols, values); } 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 ) { return( hypre_IJMatrixAssembleParCSR( ijmatrix ) ); } else { hypre_error_in_arg(1); } 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, cols, values ); } 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; MPI_Comm comm; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; HYPRE_Int my_id; if (!ijmatrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_IJMatrixComm(ijmatrix); row_partitioning = hypre_IJMatrixRowPartitioning(ijmatrix); col_partitioning = hypre_IJMatrixColPartitioning(ijmatrix); hypre_MPI_Comm_rank(comm, &my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION *ilower = row_partitioning[0]; *iupper = row_partitioning[1]-1; *jlower = col_partitioning[0]; *jupper = col_partitioning[1]-1; #else *ilower = row_partitioning[my_id]; *iupper = row_partitioning[my_id+1]-1; *jlower = col_partitioning[my_id]; *jupper = col_partitioning[my_id+1]-1; #endif 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_IJMatrixRead( const char *filename, MPI_Comm comm, HYPRE_Int type, HYPRE_IJMatrix *matrix_ptr ) { HYPRE_IJMatrix matrix; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_BigInt I, J; HYPRE_Int ncols; 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 %b %b", &ilower, &iupper, &jlower, &jupper); HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &matrix); HYPRE_IJMatrixSetObjectType(matrix, type); HYPRE_IJMatrixInitialize(matrix); /* 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 (I < ilower || I > iupper) { HYPRE_IJMatrixAddToValues(matrix, 1, &ncols, &I, &J, &value); } else { HYPRE_IJMatrixSetValues(matrix, 1, &ncols, &I, &J, &value); } } HYPRE_IJMatrixAssemble(matrix); fclose(file); *matrix_ptr = matrix; return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJMatrixPrint( HYPRE_IJMatrix matrix, const char *filename ) { MPI_Comm comm; HYPRE_BigInt *row_partitioning; HYPRE_BigInt *col_partitioning; HYPRE_BigInt ilower, iupper, jlower, jupper; HYPRE_BigInt i, ii; HYPRE_Int j; HYPRE_Int ncols; HYPRE_BigInt *cols; HYPRE_Complex *values; HYPRE_Int myid; char new_filename[255]; FILE *file; 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; } comm = hypre_IJMatrixComm(matrix); 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; } row_partitioning = hypre_IJMatrixRowPartitioning(matrix); col_partitioning = hypre_IJMatrixColPartitioning(matrix); #ifdef HYPRE_NO_GLOBAL_PARTITION ilower = row_partitioning[0]; iupper = row_partitioning[1] - 1; jlower = col_partitioning[0]; jupper = col_partitioning[1] - 1; #else ilower = row_partitioning[myid]; iupper = row_partitioning[myid+1] - 1; jlower = col_partitioning[myid]; jupper = col_partitioning[myid+1] - 1; #endif hypre_fprintf(file, "%b %b %b %b\n", ilower, iupper, jlower, jupper); HYPRE_IJMatrixGetObject(matrix, &object); for (i = ilower; i <= iupper; i++) { if ( hypre_IJMatrixObjectType(matrix) == HYPRE_PARCSR ) { #ifdef HYPRE_NO_GLOBAL_PARTITION ii = i - hypre_IJMatrixGlobalFirstRow(matrix); #else ii = i - row_partitioning[0]; #endif HYPRE_ParCSRMatrixGetRow((HYPRE_ParCSRMatrix) object, ii, &ncols, &cols, &values); for (j = 0; j < ncols; j++) { #ifdef HYPRE_NO_GLOBAL_PARTITION cols[j] += hypre_IJMatrixGlobalFirstCol(matrix); #else cols[j] += col_partitioning[0]; #endif } } for (j = 0; j < ncols; j++) { hypre_fprintf(file, "%b %b %.14e\n", i, cols[j], values[j]); } if ( hypre_IJMatrixObjectType(matrix) == HYPRE_PARCSR ) { for (j = 0; j < ncols; j++) { #ifdef HYPRE_NO_GLOBAL_PARTITION cols[j] -= hypre_IJMatrixGlobalFirstCol(matrix); #else cols[j] -= col_partitioning[0]; #endif } HYPRE_ParCSRMatrixRestoreRow((HYPRE_ParCSRMatrix) object, ii, &ncols, &cols, &values); } } fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ 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-2.18.2/src/IJ_mv/HYPRE_IJVector.c000066400000000000000000000373741355566575400173710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *partitioning; #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt row0, rowN; #else HYPRE_BigInt *recv_buf; HYPRE_BigInt *info; HYPRE_Int i, i2; #endif 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); partitioning[0] = jlower; partitioning[1] = jupper+1; /* 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; #else info = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); recv_buf = hypre_CTAlloc(HYPRE_BigInt, 2*num_procs, HYPRE_MEMORY_HOST); partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); info[0] = jlower; info[1] = jupper; hypre_MPI_Allgather(info, 2, HYPRE_MPI_BIG_INT, recv_buf, 2, HYPRE_MPI_BIG_INT, comm); partitioning[0] = recv_buf[0]; for (i=0; i < num_procs-1; i++) { i2 = i+i; if (recv_buf[i2+1] != (recv_buf[i2+2]-1)) { /*hypre_printf("Inconsistent partitioning -- HYPRE_IJVectorCreate\n"); */ hypre_error(HYPRE_ERROR_GENERIC); hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(partitioning, HYPRE_MEMORY_HOST); hypre_TFree(vec, HYPRE_MEMORY_HOST); return hypre_error_flag; } else partitioning[i+1] = recv_buf[i2+2]; } i2 = (num_procs-1)*2; partitioning[num_procs] = recv_buf[i2+1]+1; hypre_TFree(info, HYPRE_MEMORY_HOST); hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_IJVectorGlobalFirstRow(vec) = partitioning[0]; hypre_IJVectorGlobalNumRows(vec)= partitioning[num_procs]-partitioning[0]; #endif hypre_IJVectorComm(vec) = comm; hypre_IJVectorPartitioning(vec) = partitioning; hypre_IJVectorObjectType(vec) = HYPRE_UNITIALIZED; hypre_IJVectorObject(vec) = NULL; hypre_IJVectorTranslator(vec) = NULL; hypre_IJVectorAssumedPart(vec) = NULL; hypre_IJVectorPrintLevel(vec) = 0; *vector = (HYPRE_IJVector) vec; 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_IJVectorPartitioning(vec)) hypre_TFree(hypre_IJVectorPartitioning(vec), HYPRE_MEMORY_HOST); 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_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_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) = 1; 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 ) { return( hypre_IJVectorSetValuesPar(vec, nvalues, indices, values) ); } 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 ) { 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 ) { return( hypre_IJVectorAssemblePar(vec) ); } 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; MPI_Comm comm; HYPRE_BigInt *partitioning; HYPRE_Int my_id; if (!vec) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_IJVectorComm(vec); partitioning = hypre_IJVectorPartitioning(vec); hypre_MPI_Comm_rank(comm, &my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION *jlower = partitioning[0]; *jupper = partitioning[1]-1; #else *jlower = partitioning[my_id]; *jupper = partitioning[my_id+1]-1; #endif 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 *--------------------------------------------------------------------------*/ 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(vector); /* 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_IJVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_IJVectorPrint( HYPRE_IJVector vector, const char *filename ) { MPI_Comm comm; HYPRE_BigInt *partitioning; HYPRE_BigInt jlower, jupper, j; HYPRE_Complex value; HYPRE_Int myid; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION jlower = partitioning[0]; jupper = partitioning[1] - 1; #else jlower = partitioning[myid]; jupper = partitioning[myid+1] - 1; #endif hypre_fprintf(file, "%b %b\n", jlower, jupper); for (j = jlower; j <= jupper; j++) { HYPRE_IJVectorGetValues(vector, 1, &j, &value); hypre_fprintf(file, "%b %.14e\n", j, value); } fclose(file); return hypre_error_flag; } hypre-2.18.2/src/IJ_mv/HYPRE_IJ_mv.h000066400000000000000000000455661355566575400167170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name IJ System 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). * * @memo A linear-algebraic conceptual interface **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt ilower} and * {\tt iupper}. The row data is required to be such that the value * of {\tt ilower} on any process $p$ be exactly one more than the * value of {\tt iupper} on process $p-1$. 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, {\tt jlower} and {\tt jupper} typically should * match {\tt ilower} and {\tt iupper}, respectively. For rectangular * matrices, {\tt jlower} and {\tt jupper} should define a * partitioning of the columns. This partitioning must be used for * any vector $v$ that will be used in matrix-vector products with the * rectangular matrix. The matrix data structure may use {\tt jlower} * and {\tt 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); /** * Sets values for {\tt nrows} rows or partial rows of the matrix. * The arrays {\tt ncols} * and {\tt rows} are of dimension {\tt nrows} and contain the number * of columns in each row and the row indices, respectively. The * array {\tt cols} contains the column indices for each of the {\tt * rows}, and is ordered by rows. The data in the {\tt values} array * corresponds directly to the column entries in {\tt 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 * {\tt value} **/ HYPRE_Int HYPRE_IJMatrixSetConstantValues(HYPRE_IJMatrix matrix, HYPRE_Complex value); /** * Adds to values for {\tt 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 {\tt nrows} rows or partial rows of the matrix. * * Same as IJMatrixSetValues, but with an additional {\tt row_indexes} array * that provides indexes into the {\tt cols} and {\tt 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 {\tt nrows} rows or partial rows of the matrix. * * Same as IJMatrixAddToValues, but with an additional {\tt row_indexes} array * that provides indexes into the {\tt cols} and {\tt 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 {\tt nrows} rows specified in {\tt rows} * and returns them in {\tt 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 {\tt 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); /** * Set the storage type of the matrix object to be constructed. * Currently, {\tt type} can only be {\tt 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); /** * 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 {\tt 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 * {\tt diag\_sizes} and {\tt 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) 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); /** * Print the matrix to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJMatrixPrint(HYPRE_IJMatrix matrix, const char *filename); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt * jlower} and {\tt jupper}. The data is required to be such that the * value of {\tt jlower} on any process $p$ be exactly one more than * the value of {\tt jupper} on process $p-1$. 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); /** * 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); /** * (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); /** * Sets values in vector. The arrays {\tt values} and {\tt indices} * are of dimension {\tt 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); /** * 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); /** * 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, {\tt type} can only be {\tt 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); /** * Print the vector to file. This is mainly for debugging purposes. **/ HYPRE_Int HYPRE_IJVectorPrint(HYPRE_IJVector vector, const char *filename); /*@}*/ /*@}*/ #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/IJ_mv/IJMatrix.c000066400000000000000000000061241355566575400164110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 @return integer error code @param IJMatrix [IN] The ijmatrix to be pointed to. */ 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 @return integer error code @param IJMatrix [IN] The ijmatrix to be pointed to. */ 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-2.18.2/src/IJ_mv/IJMatrix_isis.c000066400000000000000000000722741355566575400174510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/IJ_mv/IJMatrix_parcsr.c000066400000000000000000004511721355566575400177720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; HYPRE_BigInt *col_starts; HYPRE_Int num_procs; HYPRE_Int i; hypre_MPI_Comm_size(comm,&num_procs); #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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 (row_partitioning != col_partitioning) { col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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]; } } } else { col_starts = row_starts; } par_matrix = hypre_ParCSRMatrixCreate(comm, hypre_IJMatrixGlobalNumRows(matrix), hypre_IJMatrixGlobalNumCols(matrix), row_starts, col_starts, 0, 0, 0); #else row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); if (row_partitioning[0]) { for (i=0; i < num_procs+1; i++) { row_starts[i] = row_partitioning[i]-row_partitioning[0]; } } else { for (i=0; i < num_procs+1; i++) { row_starts[i] = row_partitioning[i]; } } if (row_partitioning != col_partitioning) { col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); if (col_partitioning[0]) { for (i=0; i < num_procs+1; i++) { col_starts[i] = col_partitioning[i]-col_partitioning[0]; } } else { for (i=0; i < num_procs+1; i++) { col_starts[i] = col_partitioning[i]; } } } else { col_starts = row_starts; } par_matrix = hypre_ParCSRMatrixCreate(comm,row_starts[num_procs], col_starts[num_procs], row_starts, col_starts, 0, 0, 0); #endif 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; HYPRE_Int i, my_id; HYPRE_Int *row_space; HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); hypre_AuxParCSRMatrix *aux_matrix; MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_MPI_Comm_rank(comm,&my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION local_num_rows = (HYPRE_Int)(row_partitioning[1]-row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1]-col_partitioning[0]); #else local_num_rows = (HYPRE_Int)(row_partitioning[my_id+1]-row_partitioning[my_id]); local_num_cols = (HYPRE_Int)(col_partitioning[my_id+1]-col_partitioning[my_id]); #endif aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); row_space = NULL; 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; 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 *offdiag_sizes) { HYPRE_Int local_num_rows; HYPRE_Int i; hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *)hypre_IJMatrixObject(matrix); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *)hypre_IJMatrixTranslator(matrix); hypre_CSRMatrix *diag; hypre_CSRMatrix *offd; HYPRE_Int *diag_i; HYPRE_Int *offd_i; if (!par_matrix) { hypre_IJMatrixCreateParCSR(matrix); par_matrix = (hypre_ParCSRMatrix *)hypre_IJMatrixObject(matrix); } 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_CSRMatrixMemoryLocation(diag)); } for (i = 0; i < local_num_rows; i++) { diag_i[i+1] = diag_i[i] + diag_sizes[i]; } hypre_CSRMatrixI(diag) = diag_i; hypre_CSRMatrixNumNonzeros(diag) = diag_i[local_num_rows]; offd = hypre_ParCSRMatrixOffd(par_matrix); offd_i = hypre_CSRMatrixI(offd); if (!offd_i) { offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, hypre_CSRMatrixMemoryLocation(offd)); } for (i = 0; i < local_num_rows; i++) { offd_i[i+1] = offd_i[i] + offdiag_sizes[i]; } hypre_CSRMatrixI(offd) = offd_i; hypre_CSRMatrixNumNonzeros(offd) = offd_i[local_num_rows]; if (!aux_matrix) { hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, hypre_CSRMatrixNumCols(diag), NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; 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) { #ifdef HYPRE_NO_GLOBAL_PARTITION local_num_rows = (HYPRE_Int)(row_partitioning[1]-row_partitioning[0]); local_num_cols = (HYPRE_Int)(col_partitioning[1]-col_partitioning[0]); #else local_num_rows = (HYPRE_Int)(row_partitioning[my_id+1]-row_partitioning[my_id]); local_num_cols = (HYPRE_Int)(col_partitioning[my_id+1]-col_partitioning[my_id]); #endif hypre_AuxParCSRMatrixCreate(&aux_matrix, local_num_rows, local_num_cols, NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_AuxParCSRMatrixMaxOffProcElmts(aux_matrix) = max_off_proc_elmts; return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixInitializeParCSR * * initializes AuxParCSRMatrix and ParCSRMatrix as necessary * *****************************************************************************/ HYPRE_Int hypre_IJMatrixInitializeParCSR(hypre_IJMatrix *matrix) { hypre_ParCSRMatrix *par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); hypre_AuxParCSRMatrix *aux_matrix = (hypre_AuxParCSRMatrix *) hypre_IJMatrixTranslator(matrix); HYPRE_Int local_num_rows; if (hypre_IJMatrixAssembleFlag(matrix) == 0) { if (!par_matrix) { hypre_IJMatrixCreateParCSR(matrix); par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject(matrix); } local_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(par_matrix)); if (!aux_matrix) { hypre_AuxParCSRMatrixCreate( &aux_matrix, local_num_rows, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(par_matrix)), NULL); hypre_IJMatrixTranslator(matrix) = aux_matrix; } hypre_ParCSRMatrixInitialize(par_matrix); hypre_AuxParCSRMatrixInitialize(aux_matrix); if (!hypre_AuxParCSRMatrixNeedAux(aux_matrix)) { HYPRE_Int i, *indx_diag, *indx_offd, *diag_i, *offd_i; diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(par_matrix)); offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(par_matrix)); indx_diag = hypre_AuxParCSRMatrixIndxDiag(aux_matrix); indx_offd = hypre_AuxParCSRMatrixIndxOffd(aux_matrix); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i=0; i < local_num_rows; i++) { indx_diag[i] = diag_i[i]; indx_offd[i] = offd_i[i]; } } } else /* AB 4/06 - the assemble routine destroys the aux matrix - so we need to recreate if initialize is called again*/ { if (!aux_matrix) { local_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(par_matrix)); hypre_AuxParCSRMatrixCreate( &aux_matrix, local_num_rows, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(par_matrix)), NULL); 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, pstart, index; HYPRE_Int print_level = hypre_IJMatrixPrintLevel(matrix); hypre_MPI_Comm_rank(comm,&my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION pstart = 0; #else pstart = my_id; #endif #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[pstart] && row_index < row_partitioning[pstart+1]) { /* compute local row number */ index = (HYPRE_Int)(row_index - row_partitioning[pstart]); 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_BigInt *cols, HYPRE_Complex *values) { 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; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_Complex *offd_data; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *col_starts = hypre_ParCSRMatrixColStarts(par_matrix); HYPRE_BigInt *row_partitioning = hypre_IJMatrixRowPartitioning(matrix); #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt *col_partitioning = hypre_IJMatrixColPartitioning(matrix); #endif HYPRE_Int i, j, n, ii, indx, pstart; 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"); } } #ifdef HYPRE_NO_GLOBAL_PARTITION col_0 = col_starts[0]; col_n = col_starts[1]-1; first = hypre_IJMatrixGlobalFirstCol(matrix); pstart = 0; #else col_0 = col_starts[my_id]; col_n = col_starts[my_id+1]-1; first = col_partitioning[0]; pstart = my_id; #endif 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[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); 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]; } 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]; } 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; } if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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]; 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]; 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; 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; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_Complex *offd_data; HYPRE_BigInt first; HYPRE_Int pstart; /*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); #ifdef HYPRE_NO_GLOBAL_PARTITION col_0 = col_partitioning[0]; col_n = col_partitioning[1]-1; first = hypre_IJMatrixGlobalFirstCol(matrix); pstart = 0; #else col_0 = col_partitioning[my_id]; col_n = col_partitioning[my_id+1]-1; first = col_partitioning[0]; pstart = my_id; #endif 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; HYPRE_Int num_cols_offd; HYPRE_Int j_offd; for (ii=0; ii < nrows; ii++) { row = rows[ii]; n = ncols[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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; 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; } } } } return hypre_error_flag; } /****************************************************************************** * * hypre_IJMatrixSetConstantValuesParCSR * * sets all values in an already assembled IJMatrix to a constant value. * *****************************************************************************/ HYPRE_Int hypre_IJMatrixSetConstantValuesParCSR( hypre_IJMatrix *matrix, HYPRE_Complex value ) { hypre_ParCSRMatrix *par_matrix; par_matrix = (hypre_ParCSRMatrix *) hypre_IJMatrixObject( matrix ); if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled*/ { hypre_CSRMatrix *diag, *offd; HYPRE_Int *diag_i, *offd_i; HYPRE_Complex *diag_data, *offd_data; HYPRE_Int num_rows; HYPRE_Int ii; diag = hypre_ParCSRMatrixDiag(par_matrix); offd = hypre_ParCSRMatrixOffd(par_matrix); diag_i = hypre_CSRMatrixI(diag); offd_i = hypre_CSRMatrixI(offd); diag_data = hypre_CSRMatrixData(diag); offd_data = hypre_CSRMatrixData(offd); num_rows = hypre_CSRMatrixNumRows(diag); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii) HYPRE_SMP_SCHEDULE #endif for (ii=0; ii < diag_i[num_rows]; ii++) { diag_data[ii] = value; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ii) HYPRE_SMP_SCHEDULE #endif for (ii=0; ii < offd_i[num_rows]; ii++) { offd_data[ii] = 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; 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 pstart; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_Complex *offd_data; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION col_0 = col_partitioning[0]; col_n = col_partitioning[1]-1; first = hypre_IJMatrixGlobalFirstCol(matrix); pstart = 0; #else col_0 = col_partitioning[my_id]; col_n = col_partitioning[my_id+1]-1; first = col_partitioning[0]; pstart = my_id; #endif if (hypre_IJMatrixAssembleFlag(matrix)) { HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_offd; 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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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[pstart+1]-row_partitioning[pstart]); hypre_AuxParCSRMatrixCreate(&aux_matrix, size, size, NULL); hypre_AuxParCSRMatrixNeedAux(aux_matrix) = 0; hypre_IJMatrixTranslator(matrix) = aux_matrix; } current_num_elmts = hypre_AuxParCSRMatrixCurrentNumElmts(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_AuxParCSRMatrixCurrentNumElmts(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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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; 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_AuxParCSRMatrixCurrentNumElmts(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_AuxParCSRMatrixCurrentNumElmts(aux_matrix) = current_num_elmts; } } } 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)); 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. * *****************************************************************************/ #ifndef HYPRE_NO_GLOBAL_PARTITION 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_BigInt *off_proc_i, HYPRE_BigInt *off_proc_j, HYPRE_Complex *off_proc_data ) { MPI_Comm comm = hypre_IJMatrixComm(matrix); hypre_MPI_Request *requests = NULL; hypre_MPI_Status *status = NULL; HYPRE_Int i, ii, j, j2, jj, n, row_index = 0; HYPRE_BigInt row; HYPRE_Int iii, iid, indx, ip; HYPRE_Int proc_id, num_procs, my_id; HYPRE_Int num_sends, num_sends3; HYPRE_Int num_recvs; HYPRE_Int num_requests; HYPRE_Int vec_start, vec_len; HYPRE_Int *send_procs; HYPRE_Int *chunks; HYPRE_BigInt *send_i; HYPRE_Int *send_map_starts; HYPRE_Int *dbl_send_map_starts; HYPRE_Int *recv_procs; HYPRE_Int *recv_chunks; HYPRE_BigInt *recv_i; HYPRE_Int *recv_vec_starts; HYPRE_Int *dbl_recv_vec_starts; HYPRE_Int *info; HYPRE_Int *int_buffer; HYPRE_Int *proc_id_mem; HYPRE_BigInt *partitioning; HYPRE_Int *displs; HYPRE_Int *recv_buf; HYPRE_Complex *send_data; HYPRE_Complex *recv_data; hypre_MPI_Comm_size(comm,&num_procs); hypre_MPI_Comm_rank(comm, &my_id); partitioning = hypre_IJMatrixRowPartitioning(matrix); info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); chunks = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); proc_id_mem = hypre_CTAlloc(HYPRE_Int, off_proc_i_indx/2, HYPRE_MEMORY_HOST); j=0; for (i=0; i < off_proc_i_indx; i++) { row = off_proc_i[i++]; //if (row < 0) row = -row-1; n = (HYPRE_Int)off_proc_i[i]; proc_id = hypre_FindProc(partitioning,row,num_procs); proc_id_mem[j++] = proc_id; info[proc_id] += n; chunks[proc_id]++; } /* determine send_procs and amount of data to be sent */ num_sends = 0; for (i=0; i < num_procs; i++) { if (info[i]) { num_sends++; } } send_procs = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends+1, HYPRE_MEMORY_HOST); dbl_send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends+1, HYPRE_MEMORY_HOST); num_sends3 = 3*num_sends; int_buffer = hypre_CTAlloc(HYPRE_Int, 3*num_sends, HYPRE_MEMORY_HOST); j = 0; j2 = 0; send_map_starts[0] = 0; dbl_send_map_starts[0] = 0; for (i=0; i < num_procs; i++) { if (info[i]) { send_procs[j++] = i; send_map_starts[j] = send_map_starts[j-1]+2*chunks[i]+info[i]; dbl_send_map_starts[j] = dbl_send_map_starts[j-1]+info[i]; int_buffer[j2++] = i; int_buffer[j2++] = chunks[i]; int_buffer[j2++] = info[i]; } } hypre_TFree(chunks, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&num_sends3,1,HYPRE_MPI_INT,info,1,HYPRE_MPI_INT,comm); 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_Int, displs[num_procs], HYPRE_MEMORY_HOST); hypre_MPI_Allgatherv(int_buffer,num_sends3,HYPRE_MPI_INT,recv_buf,info,displs, HYPRE_MPI_INT,comm); hypre_TFree(int_buffer, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); /* determine recv procs and amount of data to be received */ num_recvs = 0; for (j=0; j < displs[num_procs]; j+=3) { if (recv_buf[j] == my_id) { num_recvs++; } } recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); recv_chunks = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs+1, HYPRE_MEMORY_HOST); dbl_recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs+1, HYPRE_MEMORY_HOST); j2 = 0; recv_vec_starts[0] = 0; dbl_recv_vec_starts[0] = 0; for (i=0; i < num_procs; i++) { for (j=displs[i]; j < displs[i+1]; j+=3) { if (recv_buf[j] == my_id) { recv_procs[j2] = i; recv_chunks[j2++] = recv_buf[j+1]; recv_vec_starts[j2] = recv_vec_starts[j2-1]+2*recv_buf[j+1] +recv_buf[j+2]; dbl_recv_vec_starts[j2] = dbl_recv_vec_starts[j2-1]+recv_buf[j+2]; } if (j2 == num_recvs) { break; } } } hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); /* set up data to be sent to send procs */ /* send_i contains for each send proc : row no., no. of elmts and column indices, send_data contains corresponding values */ send_i = hypre_CTAlloc(HYPRE_BigInt, send_map_starts[num_sends], HYPRE_MEMORY_HOST); send_data = hypre_CTAlloc(HYPRE_Complex, dbl_send_map_starts[num_sends], HYPRE_MEMORY_HOST); recv_i = hypre_CTAlloc(HYPRE_BigInt, recv_vec_starts[num_recvs], HYPRE_MEMORY_HOST); recv_data = hypre_CTAlloc(HYPRE_Complex, dbl_recv_vec_starts[num_recvs], HYPRE_MEMORY_HOST); j=0; jj=0; for (i=0; i < off_proc_i_indx; i++) { row = off_proc_i[i++]; n = (HYPRE_Int)off_proc_i[i]; proc_id = proc_id_mem[i/2]; indx = hypre_BinarySearch(send_procs,proc_id,num_sends); iii = send_map_starts[indx]; iid = dbl_send_map_starts[indx]; send_i[iii++] = row; send_i[iii++] = (HYPRE_BigInt) n; for (ii = 0; ii < n; ii++) { send_i[iii++] = off_proc_j[jj]; send_data[iid++] = off_proc_data[jj++]; } send_map_starts[indx] = iii; dbl_send_map_starts[indx] = iid; } hypre_TFree(proc_id_mem, HYPRE_MEMORY_HOST); for (i=num_sends; i > 0; i--) { send_map_starts[i] = send_map_starts[i-1]; dbl_send_map_starts[i] = dbl_send_map_starts[i-1]; } send_map_starts[0] = 0; dbl_send_map_starts[0] = 0; 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); } j=0; 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_Irecv(&recv_i[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } 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_Isend(&send_i[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } if (num_requests) { hypre_MPI_Waitall(num_requests, requests, status); } j=0; for (i=0; i < num_recvs; i++) { vec_start = dbl_recv_vec_starts[i]; vec_len = dbl_recv_vec_starts[i+1] - vec_start; ip = recv_procs[i]; hypre_MPI_Irecv(&recv_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } for (i=0; i < num_sends; i++) { vec_start = dbl_send_map_starts[i]; vec_len = dbl_send_map_starts[i+1] - vec_start; ip = send_procs[i]; hypre_MPI_Isend(&send_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, 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); } hypre_TFree(send_i, HYPRE_MEMORY_HOST); hypre_TFree(send_data, HYPRE_MEMORY_HOST); hypre_TFree(send_procs, HYPRE_MEMORY_HOST); hypre_TFree(send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(dbl_send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(recv_procs, HYPRE_MEMORY_HOST); hypre_TFree(recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(dbl_recv_vec_starts, HYPRE_MEMORY_HOST); j = 0; j2 = 0; for (i=0; i < num_recvs; i++) { for (ii=0; ii < recv_chunks[i]; ii++) { row = recv_i[j]; HYPRE_Int rcvi = (HYPRE_Int) recv_i[j+1]; hypre_IJMatrixAddToValuesParCSR(matrix,1,&rcvi,&row,&row_index, &recv_i[j+2],&recv_data[j2]); j2 += recv_i[j+1]; j += recv_i[j+1]+2; } } hypre_TFree(recv_chunks, HYPRE_MEMORY_HOST); hypre_TFree(recv_i, HYPRE_MEMORY_HOST); hypre_TFree(recv_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } #else /* assumed partition version */ 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_BigInt *off_proc_i, HYPRE_BigInt *off_proc_j, HYPRE_Complex *off_proc_data ) { 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_Int *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); 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_Int, 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 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_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_MAlloc(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; } hypre_IJMatrixAddToValuesParCSR(matrix,1,&num_elements,&row,&row_index, col_ptr,col_data_ptr); indx += (num_elements*2); } } 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); } return hypre_error_flag; } #endif /*-------------------------------------------------------------------- * 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_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 *row_length; HYPRE_BigInt **aux_j; HYPRE_Complex **aux_data; HYPRE_Int my_id, num_procs; HYPRE_Int num_rows; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt base = hypre_IJMatrixGlobalFirstCol(matrix); #else HYPRE_BigInt base = col_partitioning[0]; #endif 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; 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[my_id+1] - row_partitioning[my_id]); 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_AuxParCSRMatrixCurrentNumElmts(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_AuxParCSRMatrixCurrentNumElmts(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_AuxParCSRMatrixCurrentNumElmts(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, 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); #ifdef HYPRE_NO_GLOBAL_PARTITION num_rows = (HYPRE_Int)(row_partitioning[1] - row_partitioning[0]); col_0 = col_partitioning[0]; col_n = col_partitioning[1]-1; #else num_rows = (HYPRE_Int)(row_partitioning[my_id+1] - row_partitioning[my_id]); col_0 = col_partitioning[my_id]; col_n = col_partitioning[my_id+1]-1; #endif /* move data into ParCSRMatrix if not there already */ if (hypre_AuxParCSRMatrixNeedAux(aux_matrix)) { HYPRE_Int *diag_array, *offd_array; diag_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); offd_array = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); aux_j = hypre_AuxParCSRMatrixAuxJ(aux_matrix); aux_data = hypre_AuxParCSRMatrixAuxData(aux_matrix); row_length = hypre_AuxParCSRMatrixRowLength(aux_matrix); diag_pos = hypre_CTAlloc(HYPRE_Int, num_rows, HYPRE_MEMORY_HOST); i_diag = 0; 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 rest, size, ns, ne; HYPRE_Int num_threads, my_thread_num; num_threads = hypre_NumActiveThreads(); my_thread_num = hypre_GetThreadNum(); size = num_rows/num_threads; rest = num_rows - 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 = 0; i_offd = 0; for (i=ns; i < ne; i++) { local_j = aux_j[i]; local_data = aux_data[i]; diag_pos[i] = -1; for (j=0; j < row_length[i]; 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++) { diag_i[i] = i_diag; offd_i[i] = i_offd; local_j = aux_j[i]; local_data = aux_data[i]; 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[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 if (j != diag_pos[i]) { diag_j[i_diag] = (HYPRE_Int)(local_j[j] - col_0); diag_data[i_diag++] = local_data[j]; } } } } /* 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 the nonzero rows inside offd and diag by calling */ hypre_CSRMatrixSetRownnz(diag); hypre_CSRMatrixSetRownnz(offd); /* 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; } hypre_AuxParCSRMatrixDestroy(aux_matrix); hypre_IJMatrixTranslator(matrix) = NULL; 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; HYPRE_Complex **aux_data; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; HYPRE_Int pstart; /*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); #ifdef HYPRE_NO_GLOBAL_PARTITION col_0 = col_partitioning[0]; col_n = col_partitioning[1]-1; first = hypre_IJMatrixGlobalFirstCol(matrix); pstart = 0; #else col_0 = col_partitioning[my_id]; col_n = col_partitioning[my_id+1]-1; first = col_partitioning[0]; pstart = my_id; #endif 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; 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_AuxParCSRMatrixCurrentNumElmts(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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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++; } } /* 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_AuxParCSRMatrixCurrentNumElmts(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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; /* processor owns the row */ if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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; } } /* 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; HYPRE_Complex **aux_data; HYPRE_Int *row_length, *row_space; HYPRE_Int need_aux; HYPRE_Int pstart; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *diag_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Complex *offd_data; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION col_0 = col_partitioning[0]; col_n = col_partitioning[1]-1; first = hypre_IJMatrixGlobalFirstCol(matrix); pstart = 0; #else col_0 = col_partitioning[my_id]; col_n = col_partitioning[my_id+1]-1; first = col_partitioning[0]; pstart = my_id; #endif if (hypre_IJMatrixAssembleFlag(matrix)) /* matrix already assembled */ { HYPRE_Int num_cols_offd; HYPRE_BigInt *col_map_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_AuxParCSRMatrixCurrentNumElmts(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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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_AuxParCSRMatrixCurrentNumElmts(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[ii]; if (n == 0) /* empty row */ { continue; } indx = row_indexes[ii]; if (row >= row_partitioning[pstart] && row < row_partitioning[pstart+1]) { row_local = (HYPRE_Int)(row - row_partitioning[pstart]); /* 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); 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[pstart+1]-row_partitioning[pstart]); 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[ii]; if (n == 0) /* empty row */ { continue; } indx = my_offproc_cnt[i2+1]; current_num_elmts = hypre_AuxParCSRMatrixCurrentNumElmts(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_AuxParCSRMatrixCurrentNumElmts(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-2.18.2/src/IJ_mv/IJMatrix_petsc.c000066400000000000000000000732331355566575400176140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/IJ_mv/IJVector.c000066400000000000000000000042451355566575400164110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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-2.18.2/src/IJ_mv/IJVector_parcsr.c000066400000000000000000001327311355566575400177650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int num_procs, j; HYPRE_BigInt global_n, *partitioning, jmin; hypre_MPI_Comm_size(comm, &num_procs); #ifdef HYPRE_NO_GLOBAL_PARTITION jmin = hypre_IJVectorGlobalFirstRow(vector); global_n = hypre_IJVectorGlobalNumRows(vector); partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* Shift to zero-based partitioning for ParVector object */ for (j = 0; j < 2; j++) partitioning[j] = IJpartitioning[j] - jmin; #else jmin = IJpartitioning[0]; global_n = IJpartitioning[num_procs] - jmin; partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); /* Shift to zero-based partitioning for ParVector object */ for (j = 0; j < num_procs+1; j++) partitioning[j] = IJpartitioning[j] - jmin; #endif hypre_IJVectorObject(vector) = hypre_ParVectorCreate(comm, global_n, (HYPRE_BigInt *) 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_Int hypre_IJVectorInitializePar(hypre_IJVector *vector) { hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); HYPRE_BigInt *partitioning = hypre_ParVectorPartitioning(par_vector); hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); HYPRE_Int my_id; HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); MPI_Comm comm = hypre_IJVectorComm(vector); 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_VectorSize(local_vector) = (HYPRE_Int)(partitioning[1] - partitioning[0]); #else hypre_VectorSize(local_vector) = (HYPRE_Int)(partitioning[my_id+1] - partitioning[my_id]); #endif hypre_ParVectorInitialize(par_vector); if (!aux_vector) { hypre_AuxParVectorCreate(&aux_vector); hypre_IJVectorTranslator(vector) = aux_vector; } hypre_AuxParVectorInitialize(aux_vector); 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; 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_Int my_id; HYPRE_Int i; HYPRE_BigInt vec_start, vec_stop; HYPRE_Complex *data; hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); MPI_Comm comm = hypre_IJVectorComm(vector); HYPRE_BigInt *partitioning; hypre_Vector *local_vector; HYPRE_Int print_level = hypre_IJVectorPrintLevel(vector); 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_IJVectorZeroValuesPar\n"); hypre_printf("**** Vector storage is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } partitioning = hypre_ParVectorPartitioning(par_vector); local_vector = hypre_ParVectorLocalVector(par_vector); if (!partitioning) { if (print_level) { hypre_printf("partitioning == NULL -- "); hypre_printf("hypre_IJVectorZeroValuesPar\n"); hypre_printf("**** Vector partitioning is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } if (!local_vector) { if (print_level) { hypre_printf("local_vector == NULL -- "); hypre_printf("hypre_IJVectorZeroValuesPar\n"); hypre_printf("**** Vector local data is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } #ifdef HYPRE_NO_GLOBAL_PARTITION vec_start = partitioning[0]; vec_stop = partitioning[1]; #else vec_start = partitioning[my_id]; vec_stop = partitioning[my_id+1]; #endif if (vec_start > vec_stop) { if (print_level) { hypre_printf("vec_start > vec_stop -- "); hypre_printf("hypre_IJVectorZeroValuesPar\n"); hypre_printf("**** This vector partitioning should not occur ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } data = hypre_VectorData( local_vector ); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < (HYPRE_Int)(vec_stop - vec_start); i++) data[i] = 0.; 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_Vector *local_vector; /* 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 (!IJpartitioning) { if (print_level) { hypre_printf("IJpartitioning == NULL -- "); hypre_printf("hypre_IJVectorSetValuesPar\n"); hypre_printf("**** IJVector partitioning is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1]-1; #else vec_start = IJpartitioning[my_id]; vec_stop = IJpartitioning[my_id+1]-1; #endif 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); if (indices) { for (j = 0; j < num_values; j++) { i = indices[j]; if (i >= vec_start && i <= vec_stop) { k = (HYPRE_Int)( i- vec_start); data[k] = 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[j] = values[j]; } 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) { HYPRE_Int my_id; HYPRE_Int i, j, 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); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); MPI_Comm comm = hypre_IJVectorComm(vector); hypre_Vector *local_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_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 (!IJpartitioning) { if (print_level) { hypre_printf("IJpartitioning == NULL -- "); hypre_printf("hypre_IJVectorAddToValuesPar\n"); hypre_printf("**** IJVector partitioning is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1]-1; #else vec_start = IJpartitioning[my_id]; vec_stop = IJpartitioning[my_id+1]-1; #endif 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); if (indices) { HYPRE_Int current_num_elmts = hypre_AuxParVectorCurrentNumElmts(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++) { i = indices[j]; if (i < vec_start || 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] = i; off_proc_data[current_num_elmts++] = values[j]; hypre_AuxParVectorCurrentNumElmts(aux_vector)=current_num_elmts; } else /* local values are added to the vector */ { k = (HYPRE_Int)(i - vec_start); data[k] += 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[j] += 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_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); hypre_AuxParVector *aux_vector = (hypre_AuxParVector*) hypre_IJVectorTranslator(vector); HYPRE_BigInt *partitioning; 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); } partitioning = hypre_ParVectorPartitioning(par_vector); if (!IJpartitioning) { if (print_level) { hypre_printf("IJpartitioning == NULL -- "); hypre_printf("hypre_IJVectorAssemblePar\n"); hypre_printf("**** IJVector partitioning is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); } if (!partitioning) { if (print_level) { hypre_printf("partitioning == NULL -- "); hypre_printf("hypre_IJVectorAssemblePar\n"); hypre_printf("**** ParVector partitioning 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_AuxParVectorCurrentNumElmts(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, 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_AuxParVectorCurrentNumElmts(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; HYPRE_Int j, k; HYPRE_BigInt i, vec_start, vec_stop; HYPRE_Complex *data; HYPRE_Int ierr = 0; HYPRE_BigInt *IJpartitioning = hypre_IJVectorPartitioning(vector); hypre_ParVector *par_vector = (hypre_ParVector*) hypre_IJVectorObject(vector); MPI_Comm comm = hypre_IJVectorComm(vector); hypre_Vector *local_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; } local_vector = hypre_ParVectorLocalVector(par_vector); if (!IJpartitioning) { if (print_level) { hypre_printf("IJpartitioning == NULL -- "); hypre_printf("hypre_IJVectorGetValuesPar\n"); hypre_printf("**** IJVector partitioning is either unallocated or orphaned ****\n"); } hypre_error_in_arg(1); return hypre_error_flag; } 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION vec_start = IJpartitioning[0]; vec_stop = IJpartitioning[1]; #else vec_start = IJpartitioning[my_id]; vec_stop = IJpartitioning[my_id+1]; #endif 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; } /* Determine whether indices points to local indices only, and if not, let user know of catastrophe and exit. If indices == NULL, assume that num_values components are to be retrieved from block starting at vec_start */ if (indices) { for (i = 0; i < num_values; i++) { ierr += (indices[i] < vec_start); ierr += (indices[i] >= vec_stop); } } if (ierr) { if (print_level) { hypre_printf("indices beyond local range -- "); hypre_printf("hypre_IJVectorGetValuesPar\n"); hypre_printf("**** Indices specified are unusable ****\n"); } hypre_error_in_arg(3); return hypre_error_flag; } data = hypre_VectorData(local_vector); if (indices) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) { k = (HYPRE_Int)(indices[j] - vec_start); values[j] = data[k]; } } else { if (num_values > (HYPRE_Int)(vec_stop-vec_start)) { hypre_error_in_arg(2); return hypre_error_flag; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) values[j] = data[j]; } 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. *****************************************************************************/ #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_Int hypre_IJVectorAssembleOffProcValsPar( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_BigInt *off_proc_i, HYPRE_Complex *off_proc_data) { MPI_Comm comm = hypre_IJVectorComm(vector); hypre_ParVector *par_vector = ( hypre_ParVector *) hypre_IJVectorObject(vector); hypre_MPI_Request *requests = NULL; hypre_MPI_Status *status = NULL; HYPRE_Int i, j, j2; HYPRE_Int iii, indx, ip; HYPRE_BigInt row, first_index; HYPRE_Int proc_id, num_procs, my_id; HYPRE_Int num_sends, num_sends2; HYPRE_Int num_recvs; HYPRE_Int num_requests; HYPRE_Int vec_start, vec_len; HYPRE_Int *send_procs; HYPRE_BigInt *send_i; HYPRE_Int *send_map_starts; HYPRE_Int *recv_procs; HYPRE_BigInt *recv_i; HYPRE_Int *recv_vec_starts; HYPRE_Int *info; HYPRE_Int *int_buffer; HYPRE_Int *proc_id_mem; HYPRE_BigInt *partitioning; HYPRE_Int *displs; HYPRE_Int *recv_buf; HYPRE_Complex *send_data; HYPRE_Complex *recv_data; HYPRE_Complex *data = hypre_VectorData(hypre_ParVectorLocalVector(par_vector)); hypre_MPI_Comm_size(comm,&num_procs); hypre_MPI_Comm_rank(comm, &my_id); partitioning = hypre_IJVectorPartitioning(vector); first_index = partitioning[my_id]; info = hypre_CTAlloc(HYPRE_Int, num_procs, HYPRE_MEMORY_HOST); proc_id_mem = hypre_CTAlloc(HYPRE_Int, current_num_elmts, HYPRE_MEMORY_HOST); for (i=0; i < current_num_elmts; i++) { row = off_proc_i[i]; proc_id = hypre_FindProc(partitioning,row,num_procs); proc_id_mem[i] = proc_id; info[proc_id]++; } /* determine send_procs and amount of data to be sent */ num_sends = 0; for (i=0; i < num_procs; i++) { if (info[i]) { num_sends++; } } num_sends2 = 2*num_sends; send_procs = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_starts = hypre_CTAlloc(HYPRE_Int, num_sends+1, HYPRE_MEMORY_HOST); int_buffer = hypre_CTAlloc(HYPRE_Int, num_sends2, HYPRE_MEMORY_HOST); j = 0; j2 = 0; send_map_starts[0] = 0; for (i=0; i < num_procs; i++) { if (info[i]) { send_procs[j++] = i; send_map_starts[j] = send_map_starts[j-1]+info[i]; int_buffer[j2++] = i; int_buffer[j2++] = info[i]; } } hypre_MPI_Allgather(&num_sends2,1,HYPRE_MPI_INT,info,1,HYPRE_MPI_INT,comm); 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_Int, displs[num_procs], HYPRE_MEMORY_HOST); hypre_MPI_Allgatherv(int_buffer,num_sends2,HYPRE_MPI_INT,recv_buf,info,displs, HYPRE_MPI_INT,comm); hypre_TFree(int_buffer, HYPRE_MEMORY_HOST); hypre_TFree(info, HYPRE_MEMORY_HOST); /* determine recv procs and amount of data to be received */ num_recvs = 0; for (j=0; j < displs[num_procs]; j+=2) { if (recv_buf[j] == my_id) num_recvs++; } recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); recv_vec_starts = hypre_CTAlloc(HYPRE_Int, num_recvs+1, HYPRE_MEMORY_HOST); j2 = 0; recv_vec_starts[0] = 0; for (i=0; i < num_procs; i++) { for (j=displs[i]; j < displs[i+1]; j+=2) { if (recv_buf[j] == my_id) { recv_procs[j2++] = i; recv_vec_starts[j2] = recv_vec_starts[j2-1]+recv_buf[j+1]; } if (j2 == num_recvs) break; } } hypre_TFree(recv_buf, HYPRE_MEMORY_HOST); hypre_TFree(displs, HYPRE_MEMORY_HOST); /* set up data to be sent to send procs */ /* send_i contains for each send proc indices, send_data contains corresponding values */ send_i = hypre_CTAlloc(HYPRE_BigInt, send_map_starts[num_sends], HYPRE_MEMORY_HOST); send_data = hypre_CTAlloc(HYPRE_Complex, send_map_starts[num_sends], HYPRE_MEMORY_HOST); recv_i = hypre_CTAlloc(HYPRE_BigInt, recv_vec_starts[num_recvs], HYPRE_MEMORY_HOST); recv_data = hypre_CTAlloc(HYPRE_Complex, recv_vec_starts[num_recvs], HYPRE_MEMORY_HOST); for (i=0; i < current_num_elmts; i++) { proc_id = proc_id_mem[i]; indx = hypre_BinarySearch(send_procs,proc_id,num_sends); iii = send_map_starts[indx]; send_i[iii] = off_proc_i[i]; send_data[iii] = off_proc_data[i]; send_map_starts[indx]++; } hypre_TFree(proc_id_mem, HYPRE_MEMORY_HOST); for (i=num_sends; i > 0; i--) { send_map_starts[i] = send_map_starts[i-1]; } send_map_starts[0] = 0; num_requests = num_recvs+num_sends; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); j=0; 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_Irecv(&recv_i[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } 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_Isend(&send_i[vec_start], vec_len, HYPRE_MPI_BIG_INT, ip, 0, comm, &requests[j++]); } if (num_requests) { hypre_MPI_Waitall(num_requests, requests, status); } j=0; 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_Irecv(&recv_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, ip, 0, comm, &requests[j++]); } 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_Isend(&send_data[vec_start], vec_len, HYPRE_MPI_COMPLEX, 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); hypre_TFree(send_i, HYPRE_MEMORY_HOST); hypre_TFree(send_data, HYPRE_MEMORY_HOST); hypre_TFree(send_procs, HYPRE_MEMORY_HOST); hypre_TFree(send_map_starts, HYPRE_MEMORY_HOST); hypre_TFree(recv_procs, HYPRE_MEMORY_HOST); for (i=0; i < recv_vec_starts[num_recvs]; i++) { row = recv_i[i]; j = (HYPRE_Int)(row - first_index); data[j] += recv_data[i]; } hypre_TFree(recv_vec_starts, HYPRE_MEMORY_HOST); hypre_TFree(recv_i, HYPRE_MEMORY_HOST); hypre_TFree(recv_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } #else /* assumed partition version */ HYPRE_Int hypre_IJVectorAssembleOffProcValsPar( hypre_IJVector *vector, HYPRE_Int max_off_proc_elmts, HYPRE_Int current_num_elmts, HYPRE_BigInt *off_proc_i, HYPRE_Complex *off_proc_data) { 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); /* 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 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_MAlloc(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++; k = (HYPRE_Int)(row - first_index - global_first_row); vector_data[k] += value; } } hypre_TFree(send_proc_obj.v_elements, HYPRE_MEMORY_HOST); hypre_TFree(send_proc_obj.vec_starts, HYPRE_MEMORY_HOST); return hypre_error_flag; } #endif hypre-2.18.2/src/IJ_mv/IJ_assumed_part.c000066400000000000000000000122751355566575400177770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_LocateAssummedPartition(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_Int start=0, end=0; 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_LocateAssummedPartition(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.18.2/src/IJ_mv/IJ_matrix.h000066400000000000000000000070521355566575400166160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* distribution of rows across processors */ HYPRE_BigInt *col_partitioning; /* 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) /*-------------------------------------------------------------------------- * 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 hypre-2.18.2/src/IJ_mv/IJ_vector.h000066400000000000000000000051421355566575400166120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* Indicates partitioning over tasks */ 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 */ /* 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_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) /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ /* #include "./internal_protos.h" */ #endif hypre-2.18.2/src/IJ_mv/Makefile000066400000000000000000000036741355566575400162250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../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 OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/IJ_mv/_hypre_IJ_mv.h000066400000000000000000000560531355566575400173070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include #ifndef hypre_IJ_HEADER #define hypre_IJ_HEADER #include "_hypre_utilities.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * 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 processors */ 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 *row_length; /* row_length_diag[i] contains number of stored elements in i-th row */ HYPRE_Int *row_space; /* row_space_diag[i] contains space allocated to i-th row */ 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_num_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 */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ } hypre_AuxParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_AuxParCSRMatrixLocalNumRows(matrix) ((matrix) -> local_num_rows) #define hypre_AuxParCSRMatrixLocalNumCols(matrix) ((matrix) -> local_num_cols) #define hypre_AuxParCSRMatrixNeedAux(matrix) ((matrix) -> need_aux) #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_AuxParCSRMatrixMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParCSRMatrixCurrentNumElmts(matrix) ((matrix) -> current_num_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) #endif /****************************************************************************** * * 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_num_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_AuxParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel Vector structure *--------------------------------------------------------------------------*/ #define hypre_AuxParVectorMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParVectorCurrentNumElmts(matrix) ((matrix) -> current_num_elmts) #define hypre_AuxParVectorOffProcI(matrix) ((matrix) -> off_proc_i) #define hypre_AuxParVectorOffProcData(matrix) ((matrix) -> off_proc_data) #endif /****************************************************************************** * * 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; /* distribution of rows across processors */ HYPRE_BigInt *col_partitioning; /* distribution of columns */ HYPRE_Int object_type; /* Indicates the type of "object" */ void *object; /* Structure for storing local portion */ void *translator; /* optional storage_type specfic 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 for data items are necessary */ HYPRE_BigInt global_first_col; /* to be able to avoind 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) /*-------------------------------------------------------------------------- * 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 /****************************************************************************** * * 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; /* Indicates partitioning over tasks */ 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 */ /* 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_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) /*-------------------------------------------------------------------------- * prototypes for operations on local objects *--------------------------------------------------------------------------*/ /* #include "./internal_protos.h" */ #endif /* 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_AuxParCSRMatrixInitialize ( hypre_AuxParCSRMatrix *matrix ); HYPRE_Int hypre_AuxParCSRMatrixSetMaxOffPRocElmts ( hypre_AuxParCSRMatrix *matrix , HYPRE_Int max_off_proc_elmts ); /* 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_AuxParVectorSetMaxOffPRocElmts ( hypre_AuxParVector *vector , HYPRE_Int max_off_proc_elmts ); /* 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 ); /* 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_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_BigInt *cols , HYPRE_Complex *values ); 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_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_IJMatrixAssembleOffProcValsParCSR ( hypre_IJMatrix *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 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 ); /* 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 ); /* IJVector_parcsr.c */ HYPRE_Int hypre_IJVectorCreatePar ( hypre_IJVector *vector , HYPRE_BigInt *IJpartitioning ); HYPRE_Int hypre_IJVectorDestroyPar ( hypre_IJVector *vector ); HYPRE_Int hypre_IJVectorInitializePar ( hypre_IJVector *vector ); 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_IJVectorSetValuesPar ( hypre_IJVector *vector , HYPRE_Int num_values , const HYPRE_BigInt *indices , const HYPRE_Complex *values ); 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_BigInt *off_proc_i , HYPRE_Complex *off_proc_data ); /* 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_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_IJMatrixPrint ( HYPRE_IJMatrix matrix , const char *filename ); HYPRE_Int HYPRE_IJMatrixSetOMPFlag ( HYPRE_IJMatrix matrix , HYPRE_Int omp_flag ); /* HYPRE_IJVector.c */ HYPRE_Int HYPRE_IJVectorCreate ( MPI_Comm comm , HYPRE_BigInt jlower , HYPRE_BigInt jupper , HYPRE_IJVector *vector ); 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_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_IJVectorPrint ( HYPRE_IJVector vector , const char *filename ); #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/IJ_mv/aux_par_vector.c000066400000000000000000000062011355566575400177370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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) { hypre_AuxParVector *vector; vector = hypre_CTAlloc(hypre_AuxParVector, 1, HYPRE_MEMORY_HOST); /* set defaults */ hypre_AuxParVectorMaxOffProcElmts(vector) = 0; hypre_AuxParVectorCurrentNumElmts(vector) = 0; /* stash for setting or adding off processor values */ hypre_AuxParVectorOffProcI(vector) = NULL; hypre_AuxParVectorOffProcData(vector) = NULL; *aux_vector = vector; return 0; } /*-------------------------------------------------------------------------- * hypre_AuxParVectorDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorDestroy( hypre_AuxParVector *vector ) { HYPRE_Int ierr=0; if (vector) { if (hypre_AuxParVectorOffProcI(vector)) hypre_TFree(hypre_AuxParVectorOffProcI(vector), HYPRE_MEMORY_HOST); if (hypre_AuxParVectorOffProcData(vector)) hypre_TFree(hypre_AuxParVectorOffProcData(vector), HYPRE_MEMORY_HOST); hypre_TFree(vector, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_AuxParVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorInitialize( hypre_AuxParVector *vector ) { HYPRE_Int max_off_proc_elmts = hypre_AuxParVectorMaxOffProcElmts(vector); /* allocate stash for setting or adding off processor values */ if (max_off_proc_elmts > 0) { hypre_AuxParVectorOffProcI(vector) = hypre_CTAlloc(HYPRE_BigInt, max_off_proc_elmts, HYPRE_MEMORY_HOST); hypre_AuxParVectorOffProcData(vector) = hypre_CTAlloc(HYPRE_Complex, max_off_proc_elmts, HYPRE_MEMORY_HOST); } return 0; } /*-------------------------------------------------------------------------- * hypre_AuxParVectorSetMaxOffProcElmts *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParVectorSetMaxOffPRocElmts( hypre_AuxParVector *vector, HYPRE_Int max_off_proc_elmts ) { HYPRE_Int ierr = 0; hypre_AuxParVectorMaxOffProcElmts(vector) = max_off_proc_elmts; return ierr; } hypre-2.18.2/src/IJ_mv/aux_par_vector.h000066400000000000000000000035671355566575400177600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_num_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_AuxParVector; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel Vector structure *--------------------------------------------------------------------------*/ #define hypre_AuxParVectorMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParVectorCurrentNumElmts(matrix) ((matrix) -> current_num_elmts) #define hypre_AuxParVectorOffProcI(matrix) ((matrix) -> off_proc_i) #define hypre_AuxParVectorOffProcData(matrix) ((matrix) -> off_proc_data) //#define hypre_AuxParVectorCancelIndx(matrix) ((matrix) -> cancel_indx) #endif hypre-2.18.2/src/IJ_mv/aux_parcsr_matrix.c000066400000000000000000000157311355566575400204610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_AuxParCSRMatrixLocalNumCols(matrix) = local_num_cols; if (sizes) { hypre_AuxParCSRMatrixRowSpace(matrix) = sizes; } else { hypre_AuxParCSRMatrixRowSpace(matrix) = NULL; } /* set defaults */ hypre_AuxParCSRMatrixNeedAux(matrix) = 1; hypre_AuxParCSRMatrixMaxOffProcElmts(matrix) = 0; hypre_AuxParCSRMatrixCurrentNumElmts(matrix) = 0; hypre_AuxParCSRMatrixOffProcIIndx(matrix) = 0; hypre_AuxParCSRMatrixRowLength(matrix) = NULL; hypre_AuxParCSRMatrixAuxJ(matrix) = NULL; hypre_AuxParCSRMatrixAuxData(matrix) = NULL; hypre_AuxParCSRMatrixIndxDiag(matrix) = NULL; hypre_AuxParCSRMatrixIndxOffd(matrix) = NULL; /* stash for setting or adding off processor values */ hypre_AuxParCSRMatrixOffProcI(matrix) = NULL; hypre_AuxParCSRMatrixOffProcJ(matrix) = NULL; hypre_AuxParCSRMatrixOffProcData(matrix) = NULL; *aux_matrix = matrix; return 0; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixDestroy( hypre_AuxParCSRMatrix *matrix ) { HYPRE_Int ierr=0; HYPRE_Int i; HYPRE_Int num_rows; if (matrix) { num_rows = hypre_AuxParCSRMatrixLocalNumRows(matrix); if (hypre_AuxParCSRMatrixRowLength(matrix)) hypre_TFree(hypre_AuxParCSRMatrixRowLength(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixRowSpace(matrix)) hypre_TFree(hypre_AuxParCSRMatrixRowSpace(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixAuxJ(matrix)) { 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)) { for (i=0; i < num_rows; i++) hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix)[i], HYPRE_MEMORY_HOST); hypre_TFree(hypre_AuxParCSRMatrixAuxData(matrix), HYPRE_MEMORY_HOST); } if (hypre_AuxParCSRMatrixIndxDiag(matrix)) hypre_TFree(hypre_AuxParCSRMatrixIndxDiag(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixIndxOffd(matrix)) hypre_TFree(hypre_AuxParCSRMatrixIndxOffd(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixOffProcI(matrix)) hypre_TFree(hypre_AuxParCSRMatrixOffProcI(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixOffProcJ(matrix)) hypre_TFree(hypre_AuxParCSRMatrixOffProcJ(matrix), HYPRE_MEMORY_HOST); if (hypre_AuxParCSRMatrixOffProcData(matrix)) hypre_TFree(hypre_AuxParCSRMatrixOffProcData(matrix), HYPRE_MEMORY_HOST); hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixInitialize( hypre_AuxParCSRMatrix *matrix ) { HYPRE_Int local_num_rows = hypre_AuxParCSRMatrixLocalNumRows(matrix); HYPRE_Int *row_space = hypre_AuxParCSRMatrixRowSpace(matrix); HYPRE_Int max_off_proc_elmts = hypre_AuxParCSRMatrixMaxOffProcElmts(matrix); HYPRE_BigInt **aux_j; HYPRE_Complex **aux_data; HYPRE_Int i; if (local_num_rows < 0) return -1; if (local_num_rows == 0) return 0; /* 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)) { aux_j = hypre_CTAlloc(HYPRE_BigInt *, local_num_rows, HYPRE_MEMORY_HOST); aux_data = hypre_CTAlloc(HYPRE_Complex *, local_num_rows, HYPRE_MEMORY_HOST); if (!hypre_AuxParCSRMatrixRowLength(matrix)) hypre_AuxParCSRMatrixRowLength(matrix) = hypre_CTAlloc(HYPRE_Int, local_num_rows, HYPRE_MEMORY_HOST); if (row_space) { 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, 30, HYPRE_MEMORY_HOST); aux_data[i] = hypre_CTAlloc(HYPRE_Complex, 30, 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 0; } /*-------------------------------------------------------------------------- * hypre_AuxParCSRMatrixSetMaxOffProcElmts *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AuxParCSRMatrixSetMaxOffPRocElmts( hypre_AuxParCSRMatrix *matrix, HYPRE_Int max_off_proc_elmts ) { HYPRE_Int ierr = 0; hypre_AuxParCSRMatrixMaxOffProcElmts(matrix) = max_off_proc_elmts; return ierr; } hypre-2.18.2/src/IJ_mv/aux_parcsr_matrix.h000066400000000000000000000105071355566575400204620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 processors */ 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 *row_length; /* row_length_diag[i] contains number of stored elements in i-th row */ HYPRE_Int *row_space; /* row_space_diag[i] contains space allocated to i-th row */ 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_num_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., only used for AddToValues */ HYPRE_BigInt *off_proc_j; /* contains column indices */ HYPRE_Complex *off_proc_data; /* contains corresponding data */ } hypre_AuxParCSRMatrix; /*-------------------------------------------------------------------------- * Accessor functions for the Parallel CSR Matrix structure *--------------------------------------------------------------------------*/ #define hypre_AuxParCSRMatrixLocalNumRows(matrix) ((matrix) -> local_num_rows) #define hypre_AuxParCSRMatrixLocalNumCols(matrix) ((matrix) -> local_num_cols) #define hypre_AuxParCSRMatrixNeedAux(matrix) ((matrix) -> need_aux) #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_AuxParCSRMatrixMaxOffProcElmts(matrix) ((matrix) -> max_off_proc_elmts) #define hypre_AuxParCSRMatrixCurrentNumElmts(matrix) ((matrix) -> current_num_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_AuxParCSRMatrixAuxOffdJ(matrix) ((matrix) -> aux_offd_j) //#define hypre_AuxParCSRMatrixCancelIndx(matrix) ((matrix) -> cancel_indx) #endif hypre-2.18.2/src/IJ_mv/headers000077500000000000000000000027211355566575400161160ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <<@ #include #ifndef hypre_IJ_HEADER #define hypre_IJ_HEADER #include "_hypre_utilities.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_IJ_mv.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 ../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.18.2/src/Makefile000066400000000000000000000157611355566575400152210ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 # 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\ 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 ..."; \ (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 ..."; \ (cd test; $(MAKE) all); \ echo "Testing IJ ..."; \ (cd test; ./runtest.sh -tol 1.e-06 -mpi "$(CHECKRUN)" TEST_ij/solvers.sh); \ (cd test; ./checktest.sh); \ (cd test; ./cleantest.sh); \ echo "Testing Struct ..."; \ (cd test; ./runtest.sh -tol 1.e-06 -mpi "$(CHECKRUN)" TEST_struct/solvers.sh); \ (cd test; ./checktest.sh); \ (cd test; ./cleantest.sh); \ echo "Testing SStruct ..."; \ (cd test; ./runtest.sh -tol 1.e-06 -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.18.2/src/blas/000077500000000000000000000000001355566575400144705ustar00rootroot00000000000000hypre-2.18.2/src/blas/CMakeLists.txt000066400000000000000000000010421355566575400172250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 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 ) convert_filenames_to_full_paths(SRCS) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/blas/COPYING000066400000000000000000000031071355566575400155240ustar00rootroot00000000000000Copyright (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.18.2/src/blas/Makefile000066400000000000000000000023311355566575400161270ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/blas/README000066400000000000000000000027471355566575400153620ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 hypre-2.18.2/src/blas/_hypre_blas.h000066400000000000000000000136451355566575400171410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- * Change all 'hypre_' names based on using HYPRE or external library *--------------------------------------------------------------------------*/ #ifndef HYPRE_USING_HYPRE_BLAS #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 /*-------------------------------------------------------------------------- * 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.18.2/src/blas/dasum.c000066400000000000000000000035751355566575400157570ustar00rootroot00000000000000/* 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 */ static integer i, m; static doublereal dtemp; static 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.18.2/src/blas/daxpy.c000066400000000000000000000035331355566575400157650ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/blas/dcopy.c000066400000000000000000000035251355566575400157570ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/blas/ddot.c000066400000000000000000000037371355566575400156000ustar00rootroot00000000000000/* 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 */ static integer i__, m; static doublereal dtemp; static 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.18.2/src/blas/dgemm.c000066400000000000000000000217131355566575400157310ustar00rootroot00000000000000/* 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 */ static integer info; static logical nota, notb; static doublereal temp; static integer i, j, l; extern logical lsame_(const char *,const char *); static 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.18.2/src/blas/dgemv.c000066400000000000000000000154401355566575400157420ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer lenx, leny, i, j; extern logical lsame_(const char *,const char *); static 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.18.2/src/blas/dger.c000066400000000000000000000106621355566575400155620ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static 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.18.2/src/blas/dnrm2.c000066400000000000000000000121431355566575400156570ustar00rootroot00000000000000/* 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 */ static doublereal zero = 0.; static doublereal one = 1.; static doublereal cutlo = 8.232e-11; static doublereal cuthi = 1.304e19; /* Format strings */ /* System generated locals */ integer i__1; doublereal ret_val, d__1; /* Builtin functions */ /*doublereal sqrt(doublereal);*/ /* Local variables */ static doublereal xmax; static integer next, i__, j, ix; static 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 / (real) (*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.18.2/src/blas/drot.c000066400000000000000000000031521355566575400156050ustar00rootroot00000000000000/* 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 */ static integer i; static doublereal dtemp; static 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.18.2/src/blas/dscal.c000066400000000000000000000032351355566575400157250ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/blas/dswap.c000066400000000000000000000035611355566575400157570ustar00rootroot00000000000000/* 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 */ static integer i__, m; static doublereal dtemp; static 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.18.2/src/blas/dsymm.c000066400000000000000000000236241355566575400157740ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp1, temp2; static integer i__, j, k; extern logical lsame_(const char *,const char *); static integer nrowa; static 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.18.2/src/blas/dsymv.c000066400000000000000000000162151355566575400160030ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp1, temp2; static integer i, j; extern logical lsame_(const char *,const char *); static 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.18.2/src/blas/dsyr2.c000066400000000000000000000152631355566575400157060ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp1, temp2; static integer i, j; extern logical lsame_(const char *,const char *); static integer ix, iy, jx, jy, kx, ky; 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.18.2/src/blas/dsyr2k.c000066400000000000000000000253101355566575400160530ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp1, temp2; static integer i__, j, l; extern logical lsame_(const char *,const char *); static integer nrowa; static 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.18.2/src/blas/dsyrk.c000066400000000000000000000205401355566575400157710ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i, j, l; extern logical lsame_(const char *,const char *); static integer nrowa; static 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.18.2/src/blas/dtrmm.c000066400000000000000000000251631355566575400157660ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i__, j, k; static logical lside; extern logical lsame_(const char *,const char *); static integer nrowa; static logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/blas/dtrmv.c000066400000000000000000000172721355566575400160010ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i__, j; extern logical lsame_(const char *,const char *); static integer ix, jx, kx; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/blas/dtrsm.c000066400000000000000000000240701355566575400157700ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i, j, k; static logical lside; extern logical lsame_(const char *,const char *); static integer nrowa; static logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/blas/dtrsv.c000066400000000000000000000171521355566575400160040ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i, j; extern logical lsame_(const char *,const char *); static integer ix, jx, kx; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/blas/f2c.c000066400000000000000000000044531355566575400153140ustar00rootroot00000000000000/* 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.18.2/src/blas/f2c.h000066400000000000000000000142411355566575400153150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #if defined(HYPRE_SINGLE) #define sqrt sqrtf #elif defined(HYPRE_LONG_DOUBLE) #define sqrt sqrtl #endif #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)(); 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)(); #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.18.2/src/blas/hypre_blas.h000066400000000000000000000031551355566575400167750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/blas/idamax.c000066400000000000000000000032021355566575400160740ustar00rootroot00000000000000/* 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 */ static doublereal dmax__; static 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.18.2/src/blas/lsame.c000066400000000000000000000061611355566575400157410ustar00rootroot00000000000000/* 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.18.2/src/blas/xerbla.c000066400000000000000000000047671355566575400161270ustar00rootroot00000000000000/* 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 */ /*static integer c__1 = 1;*/ /* Subroutine */ integer xerbla_(const char *srname, integer *info) { /* Format strings */ /* static 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 */ /*static 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.18.2/src/cmbuild/000077500000000000000000000000001355566575400151665ustar00rootroot00000000000000hypre-2.18.2/src/cmbuild/README.txt000066400000000000000000000001011355566575400166540ustar00rootroot00000000000000This directory is provided for convenience to do CMake builds... hypre-2.18.2/src/config/000077500000000000000000000000001355566575400150145ustar00rootroot00000000000000hypre-2.18.2/src/config/HYPRE_config.h.cmake.in000066400000000000000000000050531355566575400210700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_DATE "@HYPRE_DATE@" #define HYPRE_RELEASE_TIME "@HYPRE_TIME@" #define HYPRE_RELEASE_BUGS "@HYPRE_BUGS@" /* Use long long int for HYPRE_BigInt */ #cmakedefine HYPRE_MIXEDINT /* Use long long int for HYPRE_BigInt and HYPRE_Int*/ #cmakedefine HYPRE_BIGINT /* Use single precision values for HYPRE_Real */ #cmakedefine HYPRE_SINGLE /* Use quad precision values for HYPRE_Real */ #cmakedefine HYPRE_LONG_DOUBLE /* Use complex values */ #cmakedefine HYPRE_COMPLEX /* Define to be the max dimension size (must be at least 3) */ #define HYPRE_MAXDIM 3 /* Use persistent communication */ #cmakedefine HYPRE_USING_PERSISTENT_COMM /* Use hopscotch hashing */ #cmakedefine HYPRE_HOPSCOTCH /* Compile without MPI */ #cmakedefine HYPRE_SEQUENTIAL /* Use HYPRE timing routines */ #cmakedefine HYPRE_TIMING /* Use internal BLAS library */ #cmakedefine HYPRE_USING_HYPRE_BLAS /* Use internal LAPACK library */ #cmakedefine HYPRE_USING_HYPRE_LAPACK /* Use assumed partition */ #cmakedefine HYPRE_NO_GLOBAL_PARTITION /* Print HYPRE errors */ #cmakedefine HYPRE_PRINT_ERRORS /* Use OpenMP */ #cmakedefine HYPRE_USING_OPENMP /* Use Caliper instrumentation */ #cmakedefine HYPRE_USING_CALIPER /* Use SuperLU_Dist */ #cmakedefine HYPRE_USING_DSUPERLU /* Use SuperLU */ #cmakedefine HAVE_SUPERLU /* #undef HYPRE_HAVE_MPI */ /* #undef HYPRE_HAVE_MPI_COMM_F2C */ /* 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 0 /* Define as in HYPRE_FMANGLE to set the BLAS name mangling scheme */ #define HYPRE_FMANGLE_BLAS 0 /* Define as in HYPRE_FMANGLE to set the LAPACK name mangling scheme */ #define HYPRE_FMANGLE_LAPACK 0 /* 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.18.2/src/config/HYPRE_config.h.in000066400000000000000000000116711355566575400200140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ /* config/HYPRE_config.h.in. Generated from configure.in by autoheader. */ /* Release name */ #undef HYPRE_RELEASE_NAME /* Version number */ #undef HYPRE_RELEASE_VERSION /* Date of release */ #undef HYPRE_RELEASE_DATE /* Time of release */ #undef HYPRE_RELEASE_TIME /* Bug reports */ #undef HYPRE_RELEASE_BUGS /* Define to 1 for Solaris. */ #undef HYPRE_SOLARIS /* Define to 1 for Linux on platforms running any version of CHAOS */ #undef HYPRE_LINUX_CHAOS /* Define to 1 for Linux platforms */ #undef HYPRE_LINUX /* Define to 1 for Alpha platforms */ #undef HYPRE_ALPHA /* Define to 1 for RS6000 platforms */ #undef HYPRE_RS6000 /* Define to 1 for IRIX64 platforms */ #undef HYPRE_IRIX64 /* Define to 1 if using long long int for HYPRE_BigInt */ #undef HYPRE_MIXEDINT /* Define to 1 if using long long int for HYPRE_Int and HYPRE_BigInt */ #undef HYPRE_BIGINT /* Define to 1 if using single precision values for HYPRE_Real */ #undef HYPRE_SINGLE /* Define to 1 if using quad precision values for HYPRE_Real */ #undef HYPRE_LONG_DOUBLE /* Define to 1 if using complex values */ #undef HYPRE_COMPLEX /* Define to be the max dimension size (must be at least 3) */ #undef HYPRE_MAXDIM /* Define to 1 if using persistent communication */ #undef HYPRE_USING_PERSISTENT_COMM /* Define to 1 if hopscotch hashing */ #undef HYPRE_HOPSCOTCH /* Define to 1 if an MPI library is found */ #undef HYPRE_HAVE_MPI /* Define to 1 if Node Aware MPI library is used */ #undef HYPRE_USING_NODE_AWARE_MPI /* Define to 1 if the routine MPI_Comm_f2c is found */ #undef HYPRE_HAVE_MPI_COMM_F2C /* Disable MPI, enable serial codes */ #undef HYPRE_SEQUENTIAL /* Using HYPRE timing routines */ #undef HYPRE_TIMING /* Using dxml for BLAS */ #undef HYPRE_USING_DXML /* Using essl for BLAS */ #undef HYPRE_USING_ESSL /* Using internal Hypre routines */ #undef HYPRE_USING_HYPRE_BLAS /* Using internal Hypre routines */ #undef HYPRE_USING_HYPRE_LAPACK /* No global partitioning being used */ #undef HYPRE_NO_GLOBAL_PARTITION /* Print HYPRE errors */ #undef HYPRE_PRINT_ERRORS /* Enable OpenMP support */ #undef HYPRE_USING_OPENMP /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * MEMORY *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /* Define to 1 if using host memory only */ #undef HYPRE_USING_HOST_MEMORY /* Define to 1 if using device memory without UM */ #undef HYPRE_USING_DEVICE_MEMORY /* Define to 1 if using unified memory */ #undef HYPRE_USING_UNIFIED_MEMORY /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * EXECUTION *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /* Define to 1 if executing on device with CUDA */ #undef HYPRE_USING_CUDA /* Define to 1 if executing on device with OpenMP */ #undef HYPRE_USING_DEVICE_OPENMP /* Define to 1 if using OpenMP on device [target alloc version] */ #undef HYPRE_DEVICE_OPENMP_ALLOC /* Define to 1 if using OpenMP on device [target mapped version] */ #undef HYPRE_DEVICE_OPENMP_MAPPED /* Define to 1 if strictly checking OpenMP offload directives */ #undef HYPRE_DEVICE_OPENMP_CHECK /* Define to 1 if executing on host/device with RAJA */ #undef HYPRE_USING_RAJA /* Define to 1 if executing on host/device with KOKKOS */ #undef HYPRE_USING_KOKKOS /* Define to 1 if using NVIDIA Tools Extension (NVTX) */ #undef HYPRE_USING_NVTX /* Define to 1 if using cuSPARSE */ #undef HYPRE_USING_CUSPARSE /* Define to 1 if using cuBLAS */ #undef HYPRE_USING_CUBLAS /* Define to 1 if using cuRAND */ #undef HYPRE_USING_CURAND /* Define to 1 if using GPU aware MPI */ #undef HYPRE_WITH_GPU_AWARE_MPI /* Define to 1 if using CUDA streams */ #undef HYPRE_USING_CUDA_STREAMS /* 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 /* Define as in HYPRE_FMANGLE to set the BLAS name mangling scheme */ #undef HYPRE_FMANGLE_BLAS /* Define as in HYPRE_FMANGLE to set the LAPACK name mangling scheme */ #undef 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. */ #undef FC_FUNC /* As HYPRE_FC_FUNC, but for C identifiers containing underscores. */ #undef FC_FUNC_ /* Define to 1 if Caliper instrumentation is enabled */ #undef HYPRE_USING_CALIPER /* Define to 1 if using SuperLU */ #undef HAVE_SUPERLU /* Define to 1 if using DSuperLU */ #undef HYPRE_USING_DSUPERLU /* Define to 1 if using MLI */ #undef HAVE_MLI hypre-2.18.2/src/config/Makefile.config.in000066400000000000000000000126671355566575400203410ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 .f .c .C .cxx .cc .cu .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 $< #.cu.o: # $(CUCC) $(CUFLAGS) -c $< 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@ #CUFLAGS = @CUFLAGS@ @DEFS@ ${CU_COMPILE_FLAGS} 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@ @RAJA_LIBS@ @KOKKOS_LIBS@ FLIBS = @FLIBS@ INCLUDES = @CALIPER_INCLUDE@ @HYPRE_RAJA_INCLUDE@ @HYPRE_KOKKOS_INCLUDE@ @HYPRE_CUDA_INCL@ @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_INCL = @HYPRE_CUDA_INCL@ HYPRE_CUDA_LIBS = @HYPRE_CUDA_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@ ################################################################## ## 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@ @HYPRE_KOKKOS_INC_FILE@ hypre-2.18.2/src/config/Makefile.config.saved000066400000000000000000000103401355566575400210170ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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. ############################################################################### srcdir = . top_srcdir = .. prefix = /g/g92/li50/workspace/hypre/src/hypre exec_prefix = ${prefix} HYPRE_RELEASE_NAME = hypre HYPRE_RELEASE_VERSION = 2.13.0 HYPRE_RELEASE_DATE = 2017/10/20 HYPRE_RELEASE_TIME = 00:00:00 HYPRE_RELEASE_BUGS = hypre-support@llnl.gov HYPRE_SRC_TOP_DIR = /g/g92/li50/workspace/hypre/src HYPRE_BUILD_DIR = /g/g92/li50/workspace/hypre/src/hypre HYPRE_INSTALL_DIR = NONE HYPRE_LIB_INSTALL = ${exec_prefix}/lib HYPRE_INC_INSTALL = ${prefix}/include HYPRE_LIB_SUFFIX = .a .SUFFIXES: .SUFFIXES: .o .f .c .C .cxx .cc .cu .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 $< .cu.o: $(NVCC) $(NVCCFLAGS) -c $< FC = mpif77 FFLAGS = -O2 -g $(FC_COMPILE_FLAGS) CC = mpixlc-gpu CFLAGS = -O -O3 -DHYPRE_USE_OMP45 -DHAVE_CONFIG_H $(C_COMPILE_FLAGS) CXX = mpixlC-gpu CXXFLAGS = -O -O3 -DHYPRE_USE_OMP45 -DHAVE_CONFIG_H $(CXX_COMPILE_FLAGS) NVCC = nvcc NVCCFLAGS = NVCCLIBS = LINK_FC = mpif77 LINK_CC = mpixlc-gpu LINK_CXX = mpixlC-gpu BUILD_FC_SHARED = BUILD_CC_SHARED = BUILD_CXX_SHARED = SHARED_COMPILE_FLAG = SHARED_BUILD_FLAG = SHARED_SET_SONAME = SHARED_OPTIONS = BUILD_PYTHON = 0 PYTHON = BUILD_JAVA = 0 AR = ar -rcu RANLIB = ranlib LDFLAGS = LIBS = -lstdc++ -lm FLIBS = INCLUDES = ################################################################## ## LAPACK Library Flags ################################################################## LAPACKLIBS = LAPACKLIBDIRS = ################################################################## ## BLAS Library Flags ################################################################## BLASLIBS = BLASLIBDIRS = ################################################################## ## MPI options ################################################################## MPIINCLUDE = MPILIBDIRS = MPILIBS = MPIFLAGS = ################################################################## ## NVCC options ################################################################## HYPRE_NVCC_MAKEFILE = Makefile.empty ################################################################## ## Caliper options ################################################################## CALIPER_INCLUDE = CALIPER_LIBS = ################################################################## ## SuperLU options ################################################################## SUPERLU_INCLUDE = SUPERLU_LIBS = ################################################################## ## DsuperLU options ################################################################## DSUPERLU_INCLUDE = DSUPERLU_LIBS = ################################################################## ## FEI options ################################################################## HYPRE_FEI_SRC_DIR = /g/g92/li50/workspace/hypre/src/FEI_mv HYPRE_FEI_BASE_DIR = /g/g92/li50/workspace/hypre/src/FEI_mv/fei-base HYPRE_FEI_SUBDIRS = fei-hypre HYPRE_FEI_HYPRE_FILES = /g/g92/li50/workspace/hypre/src/FEI_mv/fei-hypre/*.o HYPRE_FEI_FEMLI_FILES = ################################################################## ## RAJA options ################################################################## HYPRE_RAJA_LIB_DIR = HYPRE_RAJA_INCLUDE = HYPRE_RAJA_LIB = ################################################################## ## kokkos options ################################################################## HYPRE_KOKKOS_SRC_DIR = HYPRE_KOKKOS_LIB_DIR = HYPRE_KOKKOS_INCLUDE = HYPRE_KOKKOS_LIB = hypre-2.18.2/src/config/bootstrap000077500000000000000000000022351355566575400167610ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 [ -f "configure.in" ]; then echo "File configure.in already exists!" echo "Make sure this script is being run from the root source directory." exit fi ln -s config/configure.in . rm -rf aclocal.m4 configure autom4te.cache autoconf --include=config 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 vdate vnumb=`utilities/version -number` vdate=`utilities/version -date` vtime=`utilities/version -time` sed -e 's#HYPRE_VERSION [^)]*#HYPRE_VERSION '$vnumb'#' CMakeLists.txt | sed -e 's#HYPRE_DATE [^)]*#HYPRE_DATE '$vdate'#' | sed -e 's#HYPRE_TIME [^)]*#HYPRE_TIME '$vtime'#' > CMakeLists.txt.tmp mv CMakeLists.txt.tmp CMakeLists.txt # Update release information in documentation (cd docs; ./update-release.sh) hypre-2.18.2/src/config/cmake/000077500000000000000000000000001355566575400160745ustar00rootroot00000000000000hypre-2.18.2/src/config/cmake/hypre_CMakeUtilities.cmake000066400000000000000000000020561355566575400231640ustar00rootroot00000000000000# 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 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) string(REPLACE ".c" "" EXE_NAME ${SRC_FILENAME}) # Actually add the exe add_executable(${EXE_NAME} ${SRC_FILE}) # Link libraries set (HYPRE_LIBS "HYPRE") # Link libraries for Unix systems if (UNIX) list (APPEND HYPRE_LIBS m) endif (UNIX) # Append the additional libraries and options target_link_libraries(${EXE_NAME} PRIVATE "${HYPRE_LIBS}") endforeach(SRC_FILE) endfunction() hypre-2.18.2/src/config/compile000077500000000000000000000070721355566575400164000ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2003-11-09.00 # Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # 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 file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit 0 ;; -v | --v*) echo "compile $scriptversion" exit 0 ;; esac prog=$1 shift ofile= cfile= args= while test $# -gt 0; do case "$1" in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we do something ugly here. ofile=$2 shift case "$ofile" in *.o | *.obj) ;; *) args="$args -o $ofile" ofile= ;; esac ;; *.c) cfile=$1 args="$args $1" ;; *) args="$args $1" ;; esac shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$prog" $args fi # Name of file we expect compiler to create. cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir $lockdir > /dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir $lockdir; exit 1" 1 2 15 # Run the compile. "$prog" $args status=$? if test -f "$cofile"; then mv "$cofile" "$ofile" fi rmdir $lockdir exit $status # 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.18.2/src/config/config.guess000077500000000000000000001267641355566575400173540ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2016 Free Software Foundation, Inc. timestamp='2017-03-02' # 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: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -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-2016 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 trap 'exit 1' 1 2 15 # 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. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { 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) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; 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 ; set_cc_for_build= ;' # 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) >/dev/null 2>&1 ; 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/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; 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". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in 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) eval $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. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; alpha:OSF1:*:*) 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. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $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 [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; 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) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # 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:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $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; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $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 echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *: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 [ -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 echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 [ -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 [ "${HP_ARCH}" = "" ]; then eval $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 [ ${HP_ARCH} = hppa2.0w ] then eval $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 echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $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; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; 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*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; 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/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 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/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` 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 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; k1om:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; mips64el:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` 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 ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} padre:Linux:*:* echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; 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. echo i386-sequent-sysv4 exit ;; 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. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; 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 echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; 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 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; 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. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; 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*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$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 fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *: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 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac cat >&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 exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: hypre-2.18.2/src/config/config.sub000077500000000000000000001067761355566575400170200ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2016 Free Software Foundation, Inc. timestamp='2016-11-19' # 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: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=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. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Operation modes: -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-2016 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" 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 # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -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*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # 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) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $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 ;; -mvs* | -opened*) vendor=ibm ;; -os400*) 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 basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: hypre-2.18.2/src/config/configure.in000066400000000000000000002037321355566575400173340ustar00rootroot00000000000000dnl Copyright 1998-2019 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.18.2]) m4_define([M4_HYPRE_DATE], [2019/10/28]) m4_define([M4_HYPRE_TIME], [00:00:00]) m4_define([M4_HYPRE_BUGS], [hypre-support@llnl.gov]) 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.59) 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 1998-2019 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_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"], [Version 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_DATE) AC_SUBST(HYPRE_TIME) AC_SUBST(HYPRE_BUGS) AC_SUBST(HYPRE_SRCDIR) 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_cuda=no hypre_user_chose_raja=no hypre_user_chose_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_insure=no hypre_using_cuda=no hypre_using_gpu=no hypre_using_um=no hypre_gpu_mpi=no hypre_using_cuda_streams=no hypre_using_nvtx=no hypre_using_cusparse=yes hypre_using_cublas=no hypre_using_curand=yes 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 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) 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) 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) 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) 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) 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], [Max dimension]) 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) 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_HOPSCOTCH, 1) fi dnl * The --with-no-global-partition option is retained here for dnl * backward compatibility (no help string is printed). dnl * The new --enable-global-partition option takes precedence. hypre_using_global_partition=no AC_ARG_WITH(no-global-partition,, [case "${withval}" in yes) hypre_using_global_partition=no ;; no) hypre_using_global_partition=yes ;; *) hypre_using_global_partition=no ;; esac] ) AC_ARG_ENABLE(global-partition, AS_HELP_STRING([--enable-global-partition], [Use global partitioning (default is NO).]), [case "${enableval}" in yes) hypre_using_global_partition=yes ;; no) hypre_using_global_partition=no ;; *) hypre_using_global_partition=yes ;; esac] ) 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(cuda-streams, AS_HELP_STRING([--enable-cuda-streams], [Use CUDA streams (default is YES).]), [case "${enableval}" in yes) hypre_using_cuda_streams=yes ;; no) hypre_using_cuda_streams=no ;; *) hypre_using_cuda_streams=yes ;; esac], [hypre_using_cuda_streams=yes] ) AC_ARG_ENABLE(nvtx, AS_HELP_STRING([--enable-nvtx], [Use NVTX (default is NO).]), [case "${enableval}" in yes) hypre_using_nvtx=yes ;; no) hypre_using_nvtx=no ;; *) hypre_using_nvtx=no ;; esac], [hypre_using_nvtx=no] ) AC_ARG_ENABLE(cusparse, AS_HELP_STRING([--enable-cusparse], [Use cuSPARSE (default is YES).]), [case "${enableval}" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=yes ;; esac], [hypre_using_cusparse=yes] ) AC_ARG_ENABLE(cublas, AS_HELP_STRING([--enable-cublas], [Use cuBLAS (default is NO).]), [case "${enableval}" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac], [hypre_using_cublas=no] ) AC_ARG_ENABLE(curand, AS_HELP_STRING([--enable-curand], [Use cuRAND (default is YES).]), [case "${enableval}" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=yes ;; esac], [hypre_using_curand=yes] ) 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 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 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 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-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(insure, AS_HELP_STRING([--with-insure=FLAGS], [FLAGS are options to pass to insure. Nothing is done to verify that insure is available]), [case "${withval}" in yes) hypre_using_insure=yes hypre_using_debug=yes hypre_insure_flags="" ;; no) ;; *) hypre_using_insure=yes hypre_using_debug=yes hypre_insure_flags="$withval" ;; esac] ) 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.]), [ 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" 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])] ) 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 ***** 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], [Fortran mangling]) 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, [Have external SuperLU library.])], []) 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, [Have external DSuperLU library.])], []) 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_user_chose_cuda=yes hypre_using_cuda=yes ;; no) hypre_using_cuda=no ;; *) hypre_using_cuda=no ;; esac], [hypre_using_cuda=no] ) 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_user_chose_raja=yes;; no) hypre_user_chose_raja=no ;; *) hypre_user_chose_raja=no ;; esac], [hypre_using_raja=no] ) 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_user_chose_kokkos=yes ;; no) hypre_user_chose_kokkos=no ;; *) hypre_user_chose_kokkos=no ;; esac] ) 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] ) 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] ) 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] ) dnl ***** Caliper AC_ARG_WITH(caliper, AS_HELP_STRING([--with-caliper], [Use Caliper instrumentation (default is NO).]), [hypre_using_caliper=yes], [hypre_using_caliper=no]) AS_IF([test "x$with_caliper" = "xyes"], [AC_DEFINE(HYPRE_USING_CALIPER, 1, [Using Caliper instrumentation])], []) 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_device_openmp" = "yes" then AC_CHECK_PROGS(CC, [xlc-gpu clang-gpu]) fi if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CC, [xlc_r xlC_r xlc xlC icc icpc gcc g++ pgcc pgCC cc CC kcc KCC]) else AC_CHECK_PROGS(CC, [xlc xlC icc icpc gcc g++ pgcc pgCC cc CC kcc KCC]) fi else if test "$hypre_using_device_openmp" = "yes" then AC_CHECK_PROGS(CC, [mpixlc-gpu mpiclang-gpu]) fi if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CC, [mpxlc mpixlc_r mpixlc mpiicc mpigcc mpicc mpipgcc]) else AC_CHECK_PROGS(CC, [mpxlc mpixlc mpiicc mpigcc mpicc mpipgcc]) 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_device_openmp" = "yes" then AC_CHECK_PROGS(CXX, [xlC-gpu clang++-gpu]) fi if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CXX, [xlC_r xlc_r xlC xlc icpc icc g++ gcc pgCC pgcc CC cc KCC kcc]) else AC_CHECK_PROGS(CXX, [xlC xlc icpc icc g++ gcc pgCC pgcc CC cc KCC kcc]) fi else if test "$hypre_using_device_openmp" = "yes" then AC_CHECK_PROGS(CXX, [mpixlC-gpu mpiclang++-gpu]) fi if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(CXX, [mpxlC mpixlcxx_r mpixlcxx mpixlC mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC]) else AC_CHECK_PROGS(CXX, [mpxlC mpixlcxx mpixlC mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC]) 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 ifort gfortran g77 g95 pgf77 f77]) else AC_CHECK_PROGS(FC, [xlf ifort gfortran g77 g95 pgf77 f77]) fi else if test "$hypre_using_openmp" = "yes" then AC_CHECK_PROGS(FC, [mpxlf mpixlf77_r mpiifort mpif77 mpipgf77]) else AC_CHECK_PROGS(FC, [mpxlf mpixlf77 mpiifort mpif77 mpipgf77]) fi fi if test "x$FC" = "x" then hypre_using_fortran=no 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) fi fi dnl * It would be better if this could be defined above, but much work is needed dnl * to make that happen. if test "$hypre_using_global_partition" = "no" then dnl if test "$hypre_using_mpi" != "no" dnl then AC_DEFINE(HYPRE_NO_GLOBAL_PARTITION, 1) dnl fi fi if test "$hypre_using_node_aware_mpi" = "yes" then AC_DEFINE(HYPRE_USING_NODE_AWARE_MPI, 1) 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, [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 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 * Set INSURE options dnl ********************************************************************* if test "$hypre_using_insure" = "yes" then dnl LINK_F77="insure" LINK_FC="insure" LINK_CC="insure" LINK_CXX="insure" LDFLAGS=`mpicc -link-info | awk '{$1=""; print}'` LDFLAGS="$LDFLAGS ${hypre_insure_flags}" dnl F77="insure" FC="insure" CC="insure" CXX="insure" FFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $FFLAGS" CFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $CFLAGS" CXXFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $CXXFLAGS" 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 * 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 if [test "$hypre_using_cuda" = "yes" || test "$hypre_using_device_openmp" = "yes" || test "$hypre_using_um" = "yes"] then AC_CHECK_HEADERS(["${CUDA_HOME}/include/cuda.h"], [hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_HOME}]) if test "x$hypre_found_cuda" != "xyes" then AC_CHECK_HEADERS(["${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 * Set raja options dnl ********************************************************************* if test "x$hypre_user_chose_raja" = "xyes" then RAJA_LIBS=" $HYPRE_RAJA_LIB_DIR $HYPRE_RAJA_LIB " AC_DEFINE(HYPRE_USING_RAJA, 1, [RAJA being used]) if test "$hypre_using_cuda" != "yes" then if [test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r"] then CXXFLAGS="${CXXFLAGS} -+ -std=c++11" 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_user_chose_kokkos" = "xyes" then KOKKOS_LIBS="$HYPRE_KOKKOS_LIB_DIR $HYPRE_KOKKOS_LIB" AC_DEFINE(HYPRE_USING_KOKKOS, 1, [KOKKOS being used]) if test "$hypre_using_cuda" != "yes" then if [test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r"] then CXXFLAGS="${CXXFLAGS} -+ -std=c++11" fi fi dnl let CC be CXX CC=${CXX} LINK_CC=${LINK_CXX} CFLAGS=${CXXFLAGS} fi dnl ********************************************************************* dnl * Set cuda options dnl ********************************************************************* if test "$hypre_user_chose_cuda" = "yes" then AC_DEFINE(HYPRE_USING_CUDA, 1, [CUDA being used]) AC_DEFINE(HYPRE_USING_CUSPARSE, 1, [cuSPARSE being used]) if test "$hypre_using_nvtx" = "yes" then AC_DEFINE(HYPRE_USING_NVTX, 1, [NVTX being used]) fi if test "$hypre_using_cusparse" = "yes" then AC_DEFINE(HYPRE_USING_CUSPARSE, 1, [CUSPARSE being used]) fi if test "$hypre_using_cublas" = "yes" then AC_DEFINE(HYPRE_USING_CUBLAS, 1, [CUBLAS being used]) fi if test "$hypre_using_curand" = "yes" then AC_DEFINE(HYPRE_USING_CURAND, 1, [CURAND being used]) fi dnl let CC/CXX and LINK be CUCC and let host compiler be CXX AC_CHECK_PROGS(CUCC, nvcc) NVCCBIN=${CXX} CC=${CUCC} CXX=${CUCC} LINK_CC=${CXX} LINK_CXX=${CXX} dnl CUDA SM if test "x$HYPRE_CUDA_SM" = "x" then HYPRE_CUDA_SM=60 fi HYPRE_CUDA_GENCODE="-gencode arch=compute_${HYPRE_CUDA_SM},\"code=sm_${HYPRE_CUDA_SM}\"" CUFLAGS+="-O2 -ccbin=$NVCCBIN ${HYPRE_CUDA_GENCODE} -expt-extended-lambda -dc -std=c++11 -Xcompiler -Wno-deprecated-register --x cu" if test "$hypre_using_debug" = "yes" then CUFLAGS="-g ${CUFLAGS}" fi CXXFLAGS="${CUFLAGS} -Xcompiler \"${CXXFLAGS}\"" CFLAGS=${CXXFLAGS} LDFLAGS="-ccbin=$NVCCBIN ${HYPRE_CUDA_GENCODE} -Xcompiler \"${LDFLAGS}\"" HYPRE_CUDA_INCL="-I${HYPRE_CUDA_PATH}/include" HYPRE_CUDA_LIBS="-L${HYPRE_CUDA_PATH}/lib64 -lcudart" if test "$hypre_using_nvtx" = "yes" then HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi if test "$hypre_using_cusparse" = "yes" then HYPRE_CUDA_LIBS+=" -lcusparse" fi if test "$hypre_using_cublas" = "yes" then HYPRE_CUDA_LIBS+=" -lcublas" fi if test "$hypre_using_curand" = "yes" then HYPRE_CUDA_LIBS+=" -lcurand" fi fi dnl ********************************************************************* dnl * Set unified memory options dnl ********************************************************************* if test "$hypre_using_um" != "yes" then dnl Without UM if test "$hypre_user_chose_cuda" = "yes" then AC_MSG_NOTICE([***********************************************************]) AC_MSG_NOTICE([Configuring with --with-cuda=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 struct interface.]) 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 if test "$hypre_using_device_openmp" = "yes" then AC_DEFINE(HYPRE_USING_CUSPARSE, 1, [cuSPARSE being used]) if test "$hypre_using_nvtx" = "yes" then AC_DEFINE(HYPRE_USING_NVTX, 1, [NVTX being used]) fi AC_DEFINE(HYPRE_USING_DEVICE_OPENMP, 1, [Enable OpenMP (>=4.5) device directives]) AC_DEFINE(HYPRE_DEVICE_OPENMP_ALLOC, 1, [Enable device OpenMP target alloc version]) dnl AC_DEFINE(HYPRE_DEVICE_OPENMP_MAPPED, 1, [Enable device OpenMP target mapped version]) AC_CHECK_PROGS(CUCC, nvcc) CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" if [test "$CC" = "clang-gpu" || test "$CC" = "mpiclang-gpu"] then CFLAGS+=" -fopenmp-nonaliased-maps" fi if [test "$CXX" = "clang++-gpu" || test "$CXX" = "mpiclang++-gpu"] then CXXFLAGS+=" -fopenmp-nonaliased-maps" fi if test "$hypre_using_debug" = "yes" then AC_DEFINE(HYPRE_DEVICE_OPENMP_CHECK, 1, [Strictly checking OpenMP offload directives]) fi HYPRE_CUDA_INCL="-I${HYPRE_CUDA_PATH}/include" HYPRE_CUDA_LIBS="-L${HYPRE_CUDA_PATH}/lib64 -lcusparse -lcudart -lcurand" if test "$hypre_using_nvtx" = "yes" then HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi dnl let CC be CXX CC=${CXX} LINK_CC=${LINK_CXX} CXXFLAGS="-x c++ ${CXXFLAGS}" CFLAGS=${CXXFLAGS} 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" if [test "x$CXX" = "xnvcc" || test "x$CC" = "xnvcc"] then SHARED_SET_SONAME="-Xlinker=-soname," SHARED_OPTIONS="-Xlinker=-z,defs" SHARED_COMPILE_FLAG="-Xcompiler \"-fPIC\"" else SHARED_SET_SONAME="-Wl,-soname," SHARED_OPTIONS="-Wl,-z,defs" SHARED_COMPILE_FLAG="-fPIC" fi 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 if [test "x$CXX" = "xnvcc" || test "x$CC" = "xnvcc"] then SHARED_BUILD_FLAG="${SHARED_BUILD_FLAG} ${HYPRE_CUDA_GENCODE}" fi 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}" fi if test "x$hypre_using_cuda_streams" = "xyes" then AC_DEFINE([HYPRE_USING_CUDA_STREAMS],1,[HYPRE WITH CUDA STREAMS]) fi dnl ********************************************************************* dnl * Set memory env dnl ********************************************************************* if test "x$hypre_using_um" = "xyes" then AC_DEFINE([HYPRE_USING_UNIFIED_MEMORY],1,[HYPRE WITH UNIFIED MEMORY]) else if [test "x$hypre_user_chose_cuda" = "xyes" || test "x$hypre_using_device_openmp" = "xyes"] then AC_DEFINE([HYPRE_USING_DEVICE_MEMORY],1,[HYPRE WITH DEVICE MEMORY]) else AC_DEFINE([HYPRE_USING_HOST_MEMORY],1,[HYPRE WITH HOST MEMORY]) fi fi if test "$hypre_gpu_mpi" = "yes" then AC_DEFINE([HYPRE_WITH_GPU_AWARE_MPI],1,[HYPRE WITH GPU AWARE MPI]) fi 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(HYPRE_KOKKOS_PATH) 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) AC_SUBST(RAJA_LIBS) dnl ********************************************************************* dnl * KOKKOS information dnl ********************************************************************* AC_SUBST(HYPRE_KOKKOS_LIB_DIR) AC_SUBST(HYPRE_KOKKOS_INCLUDE) AC_SUBST(HYPRE_KOKKOS_LIB) AC_SUBST(KOKKOS_LIBS) AC_SUBST(HYPRE_KOKKOS_INC_FILE) dnl ********************************************************************* dnl * CUDA stuff dnl ********************************************************************* AC_SUBST(CUFLAGS) AC_SUBST(HYPRE_CUDA_INCL) AC_SUBST(HYPRE_CUDA_LIBS) dnl ********************************************************************* dnl * Caliper instrumentation dnl ********************************************************************* AC_SUBST(CALIPER_INCLUDE) AC_SUBST(CALIPER_LIBS) dnl ********************************************************************* dnl * SuperLU instrumentation dnl ********************************************************************* AC_SUBST(SUPERLU_INCLUDE) AC_SUBST(SUPERLU_LIBS) dnl ********************************************************************* dnl * DSuperLU instrumentation 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.18.2/src/config/depcomp000077500000000000000000000347711355566575400164050ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2003-11-08.23 # Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. # This program 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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.18.2/src/config/hypre_blas_macros.m4000066400000000000000000000267731355566575400207710ustar00rootroot00000000000000dnl Copyright 1998-2019 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], [BLAS mangling]) 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.18.2/src/config/hypre_lapack_macros.m4000066400000000000000000000253701355566575400212730ustar00rootroot00000000000000dnl Copyright 1998-2019 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], [LAPACK mangling]) 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.18.2/src/config/hypre_macros_misc.m4000066400000000000000000000307471355566575400207770ustar00rootroot00000000000000dnl Copyright 1998-2019 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.57)dnl AC_PREREQ(2.50) 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_TRY_LINK([],[ 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_TRY_COMPILE and not AC_CHECK_HEADER because the dnl 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_TRY_COMPILE([#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_TRY_COMPILE([#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,[Found the MPI library.]) $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.57)dnl if test "x${hypre_user_chose_cflags}" = "xno" then case "${CC}" in gcc|mpigcc|mpicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" fi ;; icc|mpiicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qopenmp" LDFLAGS="$LDFLAGS -qopenmp" fi ;; pgcc|mpipgcc) CFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -mp" LDFLAGS="$LDFLAGS -mp" fi ;; cc|xlc|xlc_r|mpxlc|mpixlc|mpixlc_r|mpixlc-gpu|mpcc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qsmp=omp" LDFLAGS="$LDFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="-fast +K3" ;; *) CFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case "${CXX}" in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qopenmp" fi ;; pgCC|mpipgCC) CXXFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$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="$CXXFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-fast +K3" ;; *) CXXFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_fflags}" = "xno" then case "${FC}" in g77|gfortran|mpigfortran|mpif77) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77) FFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -mp" fi ;; f77|f90|xlf|xlf_r|mpxlf|mpixlf77|mpixlf77_r) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$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.57)dnl if test "x${hypre_user_chose_cflags}" = "xno" then case "${CC}" in gcc|mpigcc|mpicc) CFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" fi ;; icc|mpiicc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qopenmp" LDFLAGS="$LDFLAGS -qopenmp" fi ;; pgcc|mpipgcc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -mp" LDFLAGS="$LDFLAGS -mp" fi ;; cc|xlc|mpxlc|mpixlc|mpcc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qsmp=omp" LDFLAGS="$LDFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="--c -g +K3" ;; *) CFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case "${CXX}" in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qopenmp" fi ;; pgCC|mpipgCC) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -mp" fi ;; CC|cxx|xlC|mpxlC|mpixlcxx|mpCC) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-g +K3" ;; *) CXXFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_fflags}" = "xno" then case "${FC}" in g77|gfortran|mpigfortran|mpif77) FFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77) 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) ;; sun* | solaris*) AC_DEFINE(HYPRE_SOLARIS) ;; hp* | HP*) AC_DEFINE(HYPRE_HPPA) ;; rs6000 | RS6000 | *bgl* | *BGL* | ppc64*) AC_DEFINE(HYPRE_RS6000) ;; IRIX64) AC_DEFINE(HYPRE_IRIX64) ;; 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) ;; *) AC_DEFINE(HYPRE_LINUX) ;; esac else AC_DEFINE(HYPRE_LINUX) fi ;; esac dnl * dnl * return architecture and host name values AC_SUBST(HYPRE_ARCH) AC_SUBST(HOSTNAME) ])dnl hypre-2.18.2/src/config/install-sh000077500000000000000000000224411355566575400170230ustar00rootroot00000000000000#!/bin/sh # 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.18.2/src/config/missing000077500000000000000000000246661355566575400164310ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2003-09-02.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # 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.18.2/src/config/mkinstalldirs000077500000000000000000000065351355566575400176330ustar00rootroot00000000000000#! /bin/sh # 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.18.2/src/config/windows.sh000077500000000000000000000020711355566575400170450ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) # Small modifications to several hypre Makefiles needed to allow the use of the # Visual Studio CL.exe compiler on Windows. Note that this script should be run # after ../configure, and should not be called more than once! # Move *.obj to *.o after compiling an object file sed -e s,' -c $<',' -c $<; mv -f $*.obj $*.o',g \ config/Makefile.config > /tmp/Makefile.config mv -f /tmp/Makefile.config config/Makefile.config # Take care of the special compilation of lapack/dlamch.c sed -e s,'-c dlamch.c','-c dlamch.c ; mv -f dlamch.obj dlamch.o',g \ lapack/Makefile > /tmp/Makefile.lapack mv -f /tmp/Makefile.lapack lapack/Makefile # Take care of the special compilation of SuperLU/superlu_timer.c sed -e s,' $<',' $<; mv -f $*.obj $*.o',g \ FEI_mv/SuperLU/SRC/Makefile > /tmp/Makefile.SuperLU mv -f /tmp/Makefile.SuperLU FEI_mv/SuperLU/SRC/Makefile hypre-2.18.2/src/configure000077500000000000000000010524721355566575400154710ustar00rootroot00000000000000#! /bin/sh # From configure.in Id. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for hypre 2.18.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # Copyright 1998-2019 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 if test -n "${ZSH_VERSION+set}" && (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 case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # 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 test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # 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'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_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="if test -n \"\${ZSH_VERSION+set}\" && (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 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 exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || 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_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else 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 test -z "$as_dir" && as_dir=. 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_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS 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'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$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_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=`$as_echo "$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 || $as_echo 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_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_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # 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 $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$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 || $as_echo 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" || { $as_echo "$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 } 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 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.18.2' PACKAGE_STRING='hypre 2.18.2' 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_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS AR DSUPERLU_LIBS DSUPERLU_INCLUDE SUPERLU_LIBS SUPERLU_INCLUDE CALIPER_LIBS CALIPER_INCLUDE HYPRE_CUDA_LIBS HYPRE_CUDA_INCL CUFLAGS HYPRE_KOKKOS_INC_FILE KOKKOS_LIBS HYPRE_KOKKOS_LIB HYPRE_KOKKOS_INCLUDE HYPRE_KOKKOS_LIB_DIR RAJA_LIBS HYPRE_RAJA_LIB HYPRE_RAJA_INCLUDE HYPRE_RAJA_LIB_DIR LAPACKLIBS LAPACKLIBDIRS BLASLIBS BLASLIBDIRS HYPRE_KOKKOS_PATH 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 CUCC 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 host_os host_vendor host_cpu host build_os build_vendor build_cpu build HYPRE_SRCDIR HYPRE_BUGS HYPRE_TIME HYPRE_DATE 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 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 with_no_global_partition enable_global_partition enable_fortran enable_unified_memory enable_cuda_streams enable_nvtx enable_cusparse enable_cublas enable_curand enable_gpu_aware_mpi with_LD with_LDFLAGS with_extra_CFLAGS with_extra_CXXFLAGS with_extra_BUILDFLAGS with_extra_incpath with_extra_ldpath with_insure 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_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_raja with_kokkos with_raja_include with_raja_lib with_raja_libs with_raja_lib_dirs with_kokkos_lib_dirs with_kokkos_include with_kokkos_lib with_kokkos_libs with_caliper with_caliper_include with_caliper_lib with_blas with_lapack ' ac_precious_vars='build_alias host_alias target_alias 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' 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 # Accept the important Cygnus configure options, so we can diagnose typos. 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=`$as_echo "$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=`$as_echo "$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 ;; -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=`$as_echo "$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=`$as_echo "$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. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$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" ;; *) $as_echo "$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 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 || $as_echo 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.18.2 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] --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.18.2:";; 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-global-partition Use global partitioning (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-cuda-streams Use CUDA streams (default is YES). --enable-nvtx Use NVTX (default is NO). --enable-cusparse Use cuSPARSE (default is YES). --enable-cublas Use cuBLAS (default is NO). --enable-curand Use cuRAND (default is YES). --enable-gpu-aware-mpi Use GPU memory aware MPI Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --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-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-insure=FLAGS FLAGS are options to pass to insure. Nothing is done to verify that insure is available --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-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-raja Use RAJA. Require RAJA package to be compiled properly (default is NO). --with-kokkos Use Kokkos. Require kokkos 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-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-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-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: 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 guested configure. 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 $as_echo "$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.18.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright 1998-2019 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 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\"" $as_echo "$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 $as_echo "$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_echo "$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 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\"" $as_echo "$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 $as_echo "$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_echo "$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 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\"" $as_echo "$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 $as_echo "$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_echo "$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$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\"" $as_echo "$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 $as_echo "$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_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else 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. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #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 () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$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\"" $as_echo "$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 $as_echo "$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_echo "$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_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi 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_run # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else 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 eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile 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.18.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. $as_echo "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=`$as_echo "$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=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$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 $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$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=`$as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`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" ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$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. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. HYPRE_NAME="hypre" HYPRE_VERSION="2.18.2" HYPRE_DATE="2019/10/28" HYPRE_TIME="00:00:00" HYPRE_BUGS="hypre-support@llnl.gov" HYPRE_SRCDIR="`pwd`" cat >>confdefs.h <<_ACEOF #define HYPRE_RELEASE_NAME "$HYPRE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define HYPRE_RELEASE_VERSION "$HYPRE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define HYPRE_RELEASE_DATE "$HYPRE_DATE" _ACEOF cat >>confdefs.h <<_ACEOF #define HYPRE_RELEASE_TIME "$HYPRE_TIME" _ACEOF cat >>confdefs.h <<_ACEOF #define HYPRE_RELEASE_BUGS "$HYPRE_BUGS" _ACEOF 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_cuda=no hypre_user_chose_raja=no hypre_user_chose_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_insure=no hypre_using_cuda=no hypre_using_gpu=no hypre_using_um=no hypre_gpu_mpi=no hypre_using_cuda_streams=no hypre_using_nvtx=no hypre_using_cusparse=yes hypre_using_cublas=no hypre_using_curand=yes 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_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$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+set}" = set; 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 hypre_using_debug=no fi # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; 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 hypre_using_shared=no fi # Check whether --enable-mixedint was given. if test "${enable_mixedint+set}" = set; 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 hypre_using_mixedint=no fi if test "$hypre_using_mixedint" = "yes" then $as_echo "#define HYPRE_MIXEDINT 1" >>confdefs.h fi # Check whether --enable-bigint was given. if test "${enable_bigint+set}" = set; 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 hypre_using_bigint=no fi if test "$hypre_using_bigint" = "yes" then $as_echo "#define HYPRE_BIGINT 1" >>confdefs.h fi # Check whether --enable-single was given. if test "${enable_single+set}" = set; 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 hypre_using_single=no fi if test "$hypre_using_single" = "yes" then $as_echo "#define HYPRE_SINGLE 1" >>confdefs.h fi # Check whether --enable-longdouble was given. if test "${enable_longdouble+set}" = set; 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 hypre_using_longdouble=no fi if test "$hypre_using_longdouble" = "yes" then $as_echo "#define HYPRE_LONG_DOUBLE 1" >>confdefs.h fi # Check whether --enable-complex was given. if test "${enable_complex+set}" = set; 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 hypre_using_complex=no fi if test "$hypre_using_complex" = "yes" then $as_echo "#define HYPRE_COMPLEX 1" >>confdefs.h fi # Check whether --enable-maxdim was given. if test "${enable_maxdim+set}" = set; then : enableval=$enable_maxdim; hypre_maxdim=${enableval} else hypre_maxdim=3 fi cat >>confdefs.h <<_ACEOF #define HYPRE_MAXDIM $hypre_maxdim _ACEOF # Check whether --enable-persistent was given. if test "${enable_persistent+set}" = set; 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 hypre_using_persistent=no fi if test "$hypre_using_persistent" = "yes" then $as_echo "#define HYPRE_USING_PERSISTENT_COMM 1" >>confdefs.h fi # Check whether --enable-hopscotch was given. if test "${enable_hopscotch+set}" = set; 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 hypre_using_hopscotch=no fi if test "$hypre_using_hopscotch" = "yes" then $as_echo "#define HYPRE_HOPSCOTCH 1" >>confdefs.h fi hypre_using_global_partition=no # Check whether --with-no-global-partition was given. if test "${with_no_global_partition+set}" = set; then : withval=$with_no_global_partition; case "${withval}" in yes) hypre_using_global_partition=no ;; no) hypre_using_global_partition=yes ;; *) hypre_using_global_partition=no ;; esac fi # Check whether --enable-global-partition was given. if test "${enable_global_partition+set}" = set; then : enableval=$enable_global_partition; case "${enableval}" in yes) hypre_using_global_partition=yes ;; no) hypre_using_global_partition=no ;; *) hypre_using_global_partition=yes ;; esac fi # Check whether --enable-fortran was given. if test "${enable_fortran+set}" = set; then : enableval=$enable_fortran; case "${enableval}" in yes) hypre_using_fortran=yes ;; no) hypre_using_fortran=no ;; *) hypre_using_fortran=yes ;; esac else hypre_using_fortran=yes fi # Check whether --enable-unified-memory was given. if test "${enable_unified_memory+set}" = set; then : enableval=$enable_unified_memory; case "${enableval}" in yes) hypre_using_um=yes ;; no) hypre_using_um=no ;; *) hypre_using_um=no ;; esac else hypre_using_um=no fi # Check whether --enable-cuda-streams was given. if test "${enable_cuda_streams+set}" = set; 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 hypre_using_cuda_streams=yes fi # Check whether --enable-nvtx was given. if test "${enable_nvtx+set}" = set; then : enableval=$enable_nvtx; case "${enableval}" in yes) hypre_using_nvtx=yes ;; no) hypre_using_nvtx=no ;; *) hypre_using_nvtx=no ;; esac else hypre_using_nvtx=no fi # Check whether --enable-cusparse was given. if test "${enable_cusparse+set}" = set; then : enableval=$enable_cusparse; case "${enableval}" in yes) hypre_using_cusparse=yes ;; no) hypre_using_cusparse=no ;; *) hypre_using_cusparse=yes ;; esac else hypre_using_cusparse=yes fi # Check whether --enable-cublas was given. if test "${enable_cublas+set}" = set; then : enableval=$enable_cublas; case "${enableval}" in yes) hypre_using_cublas=yes ;; no) hypre_using_cublas=no ;; *) hypre_using_cublas=no ;; esac else hypre_using_cublas=no fi # Check whether --enable-curand was given. if test "${enable_curand+set}" = set; then : enableval=$enable_curand; case "${enableval}" in yes) hypre_using_curand=yes ;; no) hypre_using_curand=no ;; *) hypre_using_curand=yes ;; esac else hypre_using_curand=yes fi # Check whether --enable-gpu-aware-mpi was given. if test "${enable_gpu_aware_mpi+set}" = set; 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 hypre_gpu_mpi=no 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$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-LD was given. if test "${with_LD+set}" = set; then : withval=$with_LD; LD=$withval fi # Check whether --with-LDFLAGS was given. if test "${with_LDFLAGS+set}" = set; then : withval=$with_LDFLAGS; LDFLAGS=$withval fi # Check whether --with-extra-CFLAGS was given. if test "${with_extra_CFLAGS+set}" = set; then : withval=$with_extra_CFLAGS; EXTRA_CFLAGS=$withval fi # Check whether --with-extra-CXXFLAGS was given. if test "${with_extra_CXXFLAGS+set}" = set; then : withval=$with_extra_CXXFLAGS; EXTRA_CXXFLAGS=$withval fi # Check whether --with-extra-BUILDFLAGS was given. if test "${with_extra_BUILDFLAGS+set}" = set; then : withval=$with_extra_BUILDFLAGS; EXTRA_BUILDFLAGS=$withval fi # Check whether --with-extra-incpath was given. if test "${with_extra_incpath+set}" = set; 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+set}" = set; then : withval=$with_extra_ldpath; LDFLAGS="-L`echo ${withval}|sed 's/ /\ -L/g'` ${LDFLAGS}" fi # Check whether --with-insure was given. if test "${with_insure+set}" = set; then : withval=$with_insure; case "${withval}" in yes) hypre_using_insure=yes hypre_using_debug=yes hypre_insure_flags="" ;; no) ;; *) hypre_using_insure=yes hypre_using_debug=yes hypre_insure_flags="$withval" ;; esac fi # Check whether --with-strict-checking was given. if test "${with_strict_checking+set}" = set; then : withval=$with_strict_checking; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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" 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 $as_echo "#define HYPRE_SEQUENTIAL 1" >>confdefs.h fi # Check whether --with-MPI-include was given. if test "${with_MPI_include+set}" = set; then : withval=$with_MPI_include; for mpi_dir in $withval; do MPIINCLUDE="$MPIINCLUDE -I$mpi_dir" done; hypre_user_chose_mpi=yes else hypre_user_chose_mpi=no fi # Check whether --with-MPI-libs was given. if test "${with_MPI_libs+set}" = set; 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+set}" = set; 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+set}" = set; then : withval=$with_MPI_flags; case "${withval}" in yes) MPIFLAGS="" ;; no) MPIFLAGS="" ;; *) MPIFLAGS=$withval ;; esac else MPIFLAGS="" fi # Check whether --with-node-aware-mpi was given. if test "${with_node_aware_mpi+set}" = set; 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 hypre_using_node_aware_mpi=no fi # Check whether --with-node-aware-mpi-include was given. if test "${with_node_aware_mpi_include+set}" = set; 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-blas-lib was given. if test "${with_blas_lib+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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 hypre_fmangle=0 fi cat >>confdefs.h <<_ACEOF #define HYPRE_FMANGLE $hypre_fmangle _ACEOF # Check whether --with-fmangle-blas was given. if test "${with_fmangle_blas+set}" = set; 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 hypre_fmangle_blas=0 fi cat >>confdefs.h <<_ACEOF #define HYPRE_FMANGLE_BLAS $hypre_fmangle_blas _ACEOF # Check whether --with-fmangle-lapack was given. if test "${with_fmangle_lapack+set}" = set; 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 hypre_fmangle_lapack=0 fi cat >>confdefs.h <<_ACEOF #define HYPRE_FMANGLE_LAPACK $hypre_fmangle_lapack _ACEOF # Check whether --with-print-errors was given. if test "${with_print_errors+set}" = set; then : withval=$with_print_errors; if test "$withval" = "yes" then $as_echo "#define HYPRE_PRINT_ERRORS 1" >>confdefs.h fi fi # Check whether --with-timing was given. if test "${with_timing+set}" = set; then : withval=$with_timing; if test "$withval" = "yes" then $as_echo "#define HYPRE_TIMING 1" >>confdefs.h fi fi # Check whether --with-openmp was given. if test "${with_openmp+set}" = set; then : withval=$with_openmp; case "${withval}" in yes) hypre_using_openmp=yes;; no) hypre_using_openmp=no ;; esac else hypre_using_openmp=no fi # Check whether --with-device-openmp was given. if test "${with_device_openmp+set}" = set; then : withval=$with_device_openmp; case "${withval}" in yes) hypre_using_device_openmp=yes ;; no) hypre_using_device_openmp=no ;; esac else hypre_using_device_openmp=no fi # Check whether --with-superlu was given. if test "${with_superlu+set}" = set; 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 : $as_echo "#define HAVE_SUPERLU 1" >>confdefs.h fi # Check whether --with-superlu-include was given. if test "${with_superlu_include+set}" = set; 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+set}" = set; 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+set}" = set; 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 : $as_echo "#define HYPRE_USING_DSUPERLU 1" >>confdefs.h fi # Check whether --with-dsuperlu-include was given. if test "${with_dsuperlu_include+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; then : withval=$with_cuda; case "$withval" in yes) hypre_user_chose_cuda=yes hypre_using_cuda=yes ;; no) hypre_using_cuda=no ;; *) hypre_using_cuda=no ;; esac else hypre_using_cuda=no fi # Check whether --with-raja was given. if test "${with_raja+set}" = set; then : withval=$with_raja; case "$withval" in yes) hypre_user_chose_raja=yes;; no) hypre_user_chose_raja=no ;; *) hypre_user_chose_raja=no ;; esac else hypre_using_raja=no fi # Check whether --with-kokkos was given. if test "${with_kokkos+set}" = set; then : withval=$with_kokkos; case "$withval" in yes) hypre_user_chose_kokkos=yes ;; no) hypre_user_chose_kokkos=no ;; *) hypre_user_chose_kokkos=no ;; esac fi # Check whether --with-raja-include was given. if test "${with_raja_include+set}" = set; 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+set}" = set; 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+set}" = set; 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+set}" = set; 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-lib-dirs was given. if test "${with_kokkos_lib_dirs+set}" = set; 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-kokkos-include was given. if test "${with_kokkos_include+set}" = set; 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+set}" = set; 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+set}" = set; 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-caliper was given. if test "${with_caliper+set}" = set; then : withval=$with_caliper; hypre_using_caliper=yes else hypre_using_caliper=no fi if test "x$with_caliper" = "xyes"; then : $as_echo "#define HYPRE_USING_CALIPER 1" >>confdefs.h fi # Check whether --with-caliper-include was given. if test "${with_caliper_include+set}" = set; 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+set}" = set; 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_device_openmp" = "yes" then for ac_prog in xlc-gpu clang-gpu do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test "$hypre_using_openmp" = "yes" then for ac_prog in xlc_r xlC_r xlc xlC icc icpc 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done else for ac_prog in xlc xlC icc icpc 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi else if test "$hypre_using_device_openmp" = "yes" then for ac_prog in mpixlc-gpu mpiclang-gpu do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test "$hypre_using_openmp" = "yes" then for ac_prog in mpxlc mpixlc_r mpixlc mpiicc mpigcc mpicc mpipgcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done else for ac_prog in mpxlc mpixlc mpiicc mpigcc mpicc mpipgcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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_device_openmp" = "yes" then for ac_prog in xlC-gpu clang++-gpu do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test "$hypre_using_openmp" = "yes" then for ac_prog in xlC_r xlc_r xlC xlc icpc icc g++ gcc 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done else for ac_prog in xlC xlc icpc icc g++ gcc 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi else if test "$hypre_using_device_openmp" = "yes" then for ac_prog in mpixlC-gpu mpiclang++-gpu do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test "$hypre_using_openmp" = "yes" then for ac_prog in mpxlC mpixlcxx_r mpixlcxx mpixlC mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done else for ac_prog in mpxlC mpixlcxx mpixlC mpiicpc mpig++ mpic++ mpicxx mpiCC mpipgCC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 ifort gfortran g77 g95 pgf77 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done else for ac_prog in xlf ifort gfortran g77 g95 pgf77 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi else if test "$hypre_using_openmp" = "yes" then for ac_prog in mpxlf mpixlf77_r mpiifort mpif77 mpipgf77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done else for ac_prog in mpxlf mpixlf77 mpiifort mpif77 mpipgf77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi fi if test "x$FC" = "x" then hypre_using_fortran=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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. $as_echo "$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\"" $as_echo "$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 $as_echo "$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 () { ; 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$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+set}" = set && 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 ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$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_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$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 () { 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$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 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$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_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else 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 () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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 test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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. $as_echo "$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\"" $as_echo "$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 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else 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 () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; 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_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_FC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 $as_echo "$ac_ct_FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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. $as_echo "$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\"" $as_echo "$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 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } if ${ac_cv_fc_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else 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 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 $as_echo "$ac_cv_fc_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+set} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 $as_echo_n "checking whether $FC accepts -g... " >&6; } if ${ac_cv_prog_fc_g+:} false; then : $as_echo_n "(cached) " >&6 else 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 ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 $as_echo "$ac_cv_prog_fc_g" >&6; } if test "$ac_test_FCFLAGS" = set; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $FC" >&5 $as_echo_n "checking how to get verbose linking output from $FC... " >&6; } if ${ac_cv_prog_fc_v+:} false; then : $as_echo_n "(cached) " >&6 else 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 $as_echo "$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"` $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $FC" >&5 $as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $FC" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 $as_echo "$as_me: WARNING: compilation failed" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_v" >&5 $as_echo "$ac_cv_prog_fc_v" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran libraries of $FC" >&5 $as_echo_n "checking for Fortran libraries of $FC... " >&6; } if ${ac_cv_fc_libs+:} false; then : $as_echo_n "(cached) " >&6 else 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 $as_echo "$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"` $as_echo "$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 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 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) case $host_os in *cygwin*) ;; *) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" ;; 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 `$as_echo "$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 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 ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; -zallextract*| -zdefaultextract) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" ;; # 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=`$as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_libs" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran libraries" >&5 $as_echo_n "checking for dummy main to link with Fortran libraries... " >&6; } if ${ac_cv_fc_dummy_main+:} false; then : $as_echo_n "(cached) " >&6 else 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 () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=none else ac_cv_fortran_dummy_main=unknown fi rm -f core conftest.err conftest.$ac_objext \ 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 () { ; 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$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_dummy_main" >&5 $as_echo "$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 cat >>confdefs.h <<_ACEOF #define FC_DUMMY_MAIN $FC_DUMMY_MAIN _ACEOF if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then $as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran name-mangling scheme" >&5 $as_echo_n "checking for Fortran name-mangling scheme... " >&6; } if ${ac_cv_fc_mangling+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { 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$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. */ #ifdef __cplusplus extern "C" #endif 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 () { 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$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_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_mangling" >&5 $as_echo "$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") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 $as_echo "$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 $as_echo "#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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5 $as_echo_n "checking for MPI_Init in -lmpi... " >&6; } if ${ac_cv_lib_mpi_MPI_Init+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return MPI_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mpi_MPI_Init=yes else ac_cv_lib_mpi_MPI_Init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpich" >&5 $as_echo_n "checking for MPI_Init in -lmpich... " >&6; } if ${ac_cv_lib_mpich_MPI_Init+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return MPI_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mpich_MPI_Init=yes else ac_cv_lib_mpich_MPI_Init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpich_MPI_Init" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpi.h" >&5 $as_echo_n "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 () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else MPILIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x = x"$MPILIBS"; then : else $as_echo "#define HYPRE_HAVE_MPI 1" >>confdefs.h LIBS="$LIBS $MPILIBS" : fi for ac_func in MPI_Comm_f2c do : 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 : cat >>confdefs.h <<_ACEOF #define HAVE_MPI_COMM_F2C 1 _ACEOF fi done 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "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 ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # 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 # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # 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 # 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_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MPI_Comm_f2c is a macro" >&5 $as_echo_n "checking whether MPI_Comm_f2c is a macro... " >&6; } if ${hypre_cv_func_MPI_Comm_f2c_macro+:} false; then : $as_echo_n "(cached) " >&6 else 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 hypre_cv_func_MPI_Comm_f2c_macro=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hypre_cv_func_MPI_Comm_f2c_macro" >&5 $as_echo "$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 $as_echo "#define HYPRE_HAVE_MPI_COMM_F2C 1" >>confdefs.h fi fi if test "$hypre_using_global_partition" = "no" then $as_echo "#define HYPRE_NO_GLOBAL_PARTITION 1" >>confdefs.h fi if test "$hypre_using_node_aware_mpi" = "yes" then $as_echo "#define HYPRE_USING_NODE_AWARE_MPI 1" >>confdefs.h fi if test "$hypre_user_chose_blas" = "yes" then for blas_lib in $BLASLIBS; do if test $blas_lib = "-ldxml" then $as_echo "#define HYPRE_USING_DXML 1" >>confdefs.h fi if test $blas_lib = "-lessl" then $as_echo "#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+set}" = set; 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=`$as_echo "ac_cv_lib_$lib''_$dgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $dgemm in -l$lib" >&5 $as_echo_n "checking for $dgemm in -l$lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return $dgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$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 $as_echo "#define HYPRE_USING_DXML 1" >>confdefs.h fi if test "$BLASLIBS" = "essl"; then $as_echo "#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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 $as_echo "$as_me: WARNING: ***************************************" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find BLAS library" >&5 $as_echo "$as_me: WARNING: Cannot find BLAS library" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: configuring --without-blas" >&5 $as_echo "$as_me: WARNING: configuring --without-blas" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 $as_echo "$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="" $as_echo "#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 $as_echo "#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+set}" = set; 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=`$as_echo "ac_cv_lib_$lib''_$dsygv" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $dsygv in -l$lib" >&5 $as_echo_n "checking for $dsygv in -l$lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return $dsygv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 $as_echo "$as_me: WARNING: ***************************************" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find LAPACK library" >&5 $as_echo "$as_me: WARNING: Cannot find LAPACK library" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: configuring --without-lapack" >&5 $as_echo "$as_me: WARNING: configuring --without-lapack" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***************************************" >&5 $as_echo "$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="" $as_echo "#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" $as_echo "#define HAVE_MLI 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gxx_personality_v0 in -lstdc++" >&5 $as_echo_n "checking for __gxx_personality_v0 in -lstdc++... " >&6; } if ${ac_cv_lib_stdcpp___gxx_personality_v0+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return __gxx_personality_v0 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_stdcpp___gxx_personality_v0=yes else ac_cv_lib_stdcpp___gxx_personality_v0=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdcpp___gxx_personality_v0" >&5 $as_echo "$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 "${CC}" in gcc|mpigcc|mpicc) CFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" fi ;; icc|mpiicc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qopenmp" LDFLAGS="$LDFLAGS -qopenmp" fi ;; pgcc|mpipgcc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -mp" LDFLAGS="$LDFLAGS -mp" fi ;; cc|xlc|mpxlc|mpixlc|mpcc) CFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qsmp=omp" LDFLAGS="$LDFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="--c -g +K3" ;; *) CFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case "${CXX}" in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qopenmp" fi ;; pgCC|mpipgCC) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -mp" fi ;; CC|cxx|xlC|mpxlC|mpixlcxx|mpCC) CXXFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-g +K3" ;; *) CXXFLAGS="-g" ;; esac fi if test "x${hypre_user_chose_fflags}" = "xno" then case "${FC}" in g77|gfortran|mpigfortran|mpif77) FFLAGS="-g -Wall" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-g" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77) 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 else if test "x${hypre_user_chose_cflags}" = "xno" then case "${CC}" in gcc|mpigcc|mpicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -fopenmp" LDFLAGS="$LDFLAGS -fopenmp" fi ;; icc|mpiicc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qopenmp" LDFLAGS="$LDFLAGS -qopenmp" fi ;; pgcc|mpipgcc) CFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -mp" LDFLAGS="$LDFLAGS -mp" fi ;; cc|xlc|xlc_r|mpxlc|mpixlc|mpixlc_r|mpixlc-gpu|mpcc) CFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CFLAGS="$CFLAGS -qsmp=omp" LDFLAGS="$LDFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CFLAGS="-fast +K3" ;; *) CFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_cxxflags}" = "xno" then case "${CXX}" in g++|gCC|mpig++|mpicxx|mpic++|mpiCC) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -fopenmp" fi ;; icpc|icc|mpiicpc|mpiicc) CXXFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$CXXFLAGS -qopenmp" fi ;; pgCC|mpipgCC) CXXFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then CXXFLAGS="$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="$CXXFLAGS -qsmp=omp" fi ;; KCC|mpiKCC) CXXFLAGS="-fast +K3" ;; *) CXXFLAGS="-O" ;; esac fi if test "x${hypre_user_chose_fflags}" = "xno" then case "${FC}" in g77|gfortran|mpigfortran|mpif77) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -fopenmp" fi ;; ifort|mpiifort) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -qopenmp" fi ;; pgf77|mpipgf77) FFLAGS="-fast" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$FFLAGS -mp" fi ;; f77|f90|xlf|xlf_r|mpxlf|mpixlf77|mpixlf77_r) FFLAGS="-O2" if test "$hypre_using_openmp" = "yes" ; then FFLAGS="$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 if test "$hypre_using_insure" = "yes" then LINK_FC="insure" LINK_CC="insure" LINK_CXX="insure" LDFLAGS=`mpicc -link-info | awk '{$1=""; print}'` LDFLAGS="$LDFLAGS ${hypre_insure_flags}" FC="insure" CC="insure" CXX="insure" FFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $FFLAGS" CFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $CFLAGS" CXXFLAGS="`mpicc -link-info | awk '{$1=""; print}'` $CXXFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cabs in -lm" >&5 $as_echo_n "checking for cabs in -lm... " >&6; } if ${ac_cv_lib_m_cabs+:} false; then : $as_echo_n "(cached) " >&6 else 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. */ #ifdef __cplusplus extern "C" #endif 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 () { return cabs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cabs=yes else ac_cv_lib_m_cabs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cabs" >&5 $as_echo "$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_caliper" = "yes" then if test "$hypre_user_gave_caliper_inc" != "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 $as_echo "$as_me: WARNING: *******************************************************" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-caliper=yes without providing" >&5 $as_echo "$as_me: WARNING: Configuring with --with-caliper=yes without providing" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-caliper-include=." >&5 $as_echo "$as_me: WARNING: --with-caliper-include=." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using default user include path." >&5 $as_echo "$as_me: WARNING: Using default user include path." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: Caliper annotations may not work." >&5 $as_echo "$as_me: WARNING: NOTE: Caliper annotations may not work." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 $as_echo "$as_me: WARNING: *******************************************************" >&2;} fi if test "$hypre_user_gave_caliper_lib" != "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 $as_echo "$as_me: WARNING: *******************************************************" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Configuring with --with-caliper=yes without providing" >&5 $as_echo "$as_me: WARNING: Configuring with --with-caliper=yes without providing" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-caliper-lib=." >&5 $as_echo "$as_me: WARNING: --with-caliper-lib=." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using default user library path." >&5 $as_echo "$as_me: WARNING: Using default user library path." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: NOTE: Caliper annotations may not work." >&5 $as_echo "$as_me: WARNING: NOTE: Caliper annotations may not work." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *******************************************************" >&5 $as_echo "$as_me: WARNING: *******************************************************" >&2;} fi fi if test "$hypre_using_cuda" = "yes" || test "$hypre_using_device_openmp" = "yes" || test "$hypre_using_um" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #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 () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in "${CUDA_HOME}/include/cuda.h" do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_HOME} fi done if test "x$hypre_found_cuda" != "xyes" then for ac_header in "${CUDA_PATH}/include/cuda.h" do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF hypre_found_cuda=yes; HYPRE_CUDA_PATH=${CUDA_PATH} fi done 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 "x$hypre_user_chose_raja" = "xyes" then RAJA_LIBS=" $HYPRE_RAJA_LIB_DIR $HYPRE_RAJA_LIB " $as_echo "#define HYPRE_USING_RAJA 1" >>confdefs.h if test "$hypre_using_cuda" != "yes" then if test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r" then CXXFLAGS="${CXXFLAGS} -+ -std=c++11" fi fi CC=${CXX} LINK_CC=${LINK_CXX} CFLAGS=${CXXFLAGS} fi if test "x$hypre_user_chose_kokkos" = "xyes" then KOKKOS_LIBS="$HYPRE_KOKKOS_LIB_DIR $HYPRE_KOKKOS_LIB" $as_echo "#define HYPRE_USING_KOKKOS 1" >>confdefs.h if test "$hypre_using_cuda" != "yes" then if test "$CXX" = "mpixlC" || test "$CXX" = "xlC_r" then CXXFLAGS="${CXXFLAGS} -+ -std=c++11" fi fi CC=${CXX} LINK_CC=${LINK_CXX} CFLAGS=${CXXFLAGS} fi if test "$hypre_user_chose_cuda" = "yes" then $as_echo "#define HYPRE_USING_CUDA 1" >>confdefs.h $as_echo "#define HYPRE_USING_CUSPARSE 1" >>confdefs.h if test "$hypre_using_nvtx" = "yes" then $as_echo "#define HYPRE_USING_NVTX 1" >>confdefs.h fi if test "$hypre_using_cusparse" = "yes" then $as_echo "#define HYPRE_USING_CUSPARSE 1" >>confdefs.h fi if test "$hypre_using_cublas" = "yes" then $as_echo "#define HYPRE_USING_CUBLAS 1" >>confdefs.h fi if test "$hypre_using_curand" = "yes" then $as_echo "#define HYPRE_USING_CURAND 1" >>confdefs.h fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CUCC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 $as_echo "$CUCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CUCC" && break done NVCCBIN=${CXX} CC=${CUCC} CXX=${CUCC} LINK_CC=${CXX} LINK_CXX=${CXX} if test "x$HYPRE_CUDA_SM" = "x" then HYPRE_CUDA_SM=60 fi HYPRE_CUDA_GENCODE="-gencode arch=compute_${HYPRE_CUDA_SM},\"code=sm_${HYPRE_CUDA_SM}\"" CUFLAGS+="-O2 -ccbin=$NVCCBIN ${HYPRE_CUDA_GENCODE} -expt-extended-lambda -dc -std=c++11 -Xcompiler -Wno-deprecated-register --x cu" if test "$hypre_using_debug" = "yes" then CUFLAGS="-g ${CUFLAGS}" fi CXXFLAGS="${CUFLAGS} -Xcompiler \"${CXXFLAGS}\"" CFLAGS=${CXXFLAGS} LDFLAGS="-ccbin=$NVCCBIN ${HYPRE_CUDA_GENCODE} -Xcompiler \"${LDFLAGS}\"" HYPRE_CUDA_INCL="-I${HYPRE_CUDA_PATH}/include" HYPRE_CUDA_LIBS="-L${HYPRE_CUDA_PATH}/lib64 -lcudart" if test "$hypre_using_nvtx" = "yes" then HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi if test "$hypre_using_cusparse" = "yes" then HYPRE_CUDA_LIBS+=" -lcusparse" fi if test "$hypre_using_cublas" = "yes" then HYPRE_CUDA_LIBS+=" -lcublas" fi if test "$hypre_using_curand" = "yes" then HYPRE_CUDA_LIBS+=" -lcurand" fi fi if test "$hypre_using_um" != "yes" then if test "$hypre_user_chose_cuda" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 $as_echo "$as_me: ***********************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Configuring with --with-cuda=yes without unified memory." >&5 $as_echo "$as_me: Configuring with --with-cuda=yes without unified memory." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: It only works for struct interface." >&5 $as_echo "$as_me: It only works for struct interface." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 $as_echo "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 $as_echo "$as_me: ***********************************************************" >&6;} fi if test "$hypre_using_device_openmp" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 $as_echo "$as_me: ***********************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Configuring with --with-device-openmp=yes without unified memory." >&5 $as_echo "$as_me: Configuring with --with-device-openmp=yes without unified memory." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: It only works for struct interface." >&5 $as_echo "$as_me: It only works for struct interface." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Use --enable-unified-memory to compile with unified memory." >&5 $as_echo "$as_me: Use --enable-unified-memory to compile with unified memory." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ***********************************************************" >&5 $as_echo "$as_me: ***********************************************************" >&6;} fi fi if test "$hypre_using_openmp" = "yes" then $as_echo "#define HYPRE_USING_OPENMP 1" >>confdefs.h fi if test "$hypre_using_device_openmp" = "yes" then $as_echo "#define HYPRE_USING_CUSPARSE 1" >>confdefs.h if test "$hypre_using_nvtx" = "yes" then $as_echo "#define HYPRE_USING_NVTX 1" >>confdefs.h fi $as_echo "#define HYPRE_USING_DEVICE_OPENMP 1" >>confdefs.h $as_echo "#define HYPRE_DEVICE_OPENMP_ALLOC 1" >>confdefs.h 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CUCC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. 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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUCC" >&5 $as_echo "$CUCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CUCC" && break done CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" if test "$CC" = "clang-gpu" || test "$CC" = "mpiclang-gpu" then CFLAGS+=" -fopenmp-nonaliased-maps" fi if test "$CXX" = "clang++-gpu" || test "$CXX" = "mpiclang++-gpu" then CXXFLAGS+=" -fopenmp-nonaliased-maps" fi if test "$hypre_using_debug" = "yes" then $as_echo "#define HYPRE_DEVICE_OPENMP_CHECK 1" >>confdefs.h fi HYPRE_CUDA_INCL="-I${HYPRE_CUDA_PATH}/include" HYPRE_CUDA_LIBS="-L${HYPRE_CUDA_PATH}/lib64 -lcusparse -lcudart -lcurand" if test "$hypre_using_nvtx" = "yes" then HYPRE_CUDA_LIBS+=" -lnvToolsExt" fi CC=${CXX} LINK_CC=${LINK_CXX} CXXFLAGS="-x c++ ${CXXFLAGS}" CFLAGS=${CXXFLAGS} fi if test "$hypre_using_shared" = "yes" then HYPRE_LIBSUFFIX=".so" if test "x$CXX" = "xnvcc" || test "x$CC" = "xnvcc" then SHARED_SET_SONAME="-Xlinker=-soname," SHARED_OPTIONS="-Xlinker=-z,defs" SHARED_COMPILE_FLAG="-Xcompiler \"-fPIC\"" else SHARED_SET_SONAME="-Wl,-soname," SHARED_OPTIONS="-Wl,-z,defs" SHARED_COMPILE_FLAG="-fPIC" fi 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 if test "x$CXX" = "xnvcc" || test "x$CC" = "xnvcc" then SHARED_BUILD_FLAG="${SHARED_BUILD_FLAG} ${HYPRE_CUDA_GENCODE}" fi 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}" fi if test "x$hypre_using_cuda_streams" = "xyes" then $as_echo "#define HYPRE_USING_CUDA_STREAMS 1" >>confdefs.h fi if test "x$hypre_using_um" = "xyes" then $as_echo "#define HYPRE_USING_UNIFIED_MEMORY 1" >>confdefs.h else if test "x$hypre_user_chose_cuda" = "xyes" || test "x$hypre_using_device_openmp" = "xyes" then $as_echo "#define HYPRE_USING_DEVICE_MEMORY 1" >>confdefs.h else $as_echo "#define HYPRE_USING_HOST_MEMORY 1" >>confdefs.h fi fi if test "$hypre_gpu_mpi" = "yes" then $as_echo "#define HYPRE_WITH_GPU_AWARE_MPI 1" >>confdefs.h fi HYPRE_INSTALLDIR="${prefix}" HYPRE_LIBINSTALL="${libdir}" HYPRE_INCINSTALL="${includedir}" if test $host_alias = $build_alias then { $as_echo "$as_me:${as_lineno-$LINENO}: checking the hostname" >&5 $as_echo_n "checking the hostname... " >&6; } hypre_hostname=hostname HOSTNAME="`$hypre_hostname`" if test -z "$HOSTNAME" then HOSTNAME=unknown { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hostname is unknown" >&5 $as_echo "$as_me: WARNING: hostname is unknown" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HOSTNAME" >&5 $as_echo "$HOSTNAME" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking the architecture" >&5 $as_echo_n "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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find tarch" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: architecture is unknown" >&5 $as_echo "$as_me: WARNING: architecture is unknown" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HYPRE_ARCH" >&5 $as_echo "$HYPRE_ARCH" >&6; } fi else HYPRE_ARCH=$ARCH { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HYPRE_ARCH" >&5 $as_echo "$HYPRE_ARCH" >&6; } fi else HYPRE_ARCH=$host_alias HOSTNAME=unknown fi case $HYPRE_ARCH in alpha) $as_echo "#define HYPRE_ALPHA 1" >>confdefs.h ;; sun* | solaris*) $as_echo "#define HYPRE_SOLARIS 1" >>confdefs.h ;; hp* | HP*) $as_echo "#define HYPRE_HPPA 1" >>confdefs.h ;; rs6000 | RS6000 | *bgl* | *BGL* | ppc64*) $as_echo "#define HYPRE_RS6000 1" >>confdefs.h ;; IRIX64) $as_echo "#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*) $as_echo "#define HYPRE_LINUX_CHAOS 1" >>confdefs.h ;; *) $as_echo "#define HYPRE_LINUX 1" >>confdefs.h ;; esac else $as_echo "#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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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+set}" = set || &/ 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 { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$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=`$as_echo "$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" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$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 if test -n "${ZSH_VERSION+set}" && (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 case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # 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 test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # 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 $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$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_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_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 || $as_echo 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 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 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=`$as_echo "$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 || $as_echo 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.18.2, which was generated by GNU Autoconf 2.69. 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ hypre config.status 2.18.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 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 ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$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=`$as_echo "$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 ) $as_echo "$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 \$as_echo "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 $as_echo "$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+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || 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=`$as_echo "$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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$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 || $as_echo 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$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"; } && { $as_echo "$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 $as_echo "$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 { $as_echo "/* $configure_input */" \ && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$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 $as_echo "/* $configure_input */" \ && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$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.18.2/src/distributed_ls/000077500000000000000000000000001355566575400165675ustar00rootroot00000000000000hypre-2.18.2/src/distributed_ls/CMakeLists.txt000066400000000000000000000006431355566575400213320ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 "") set(SRCS "") add_subdirectory(Euclid) add_subdirectory(ParaSails) add_subdirectory(pilut) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/distributed_ls/Euclid/000077500000000000000000000000001355566575400177745ustar00rootroot00000000000000hypre-2.18.2/src/distributed_ls/Euclid/CMakeLists.txt000066400000000000000000000013251355566575400225350ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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(EUCLID_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 ) convert_filenames_to_full_paths(EUCLID_SRCS) set(SRCS ${SRCS} ${EUCLID_SRCS} PARENT_SCOPE) hypre-2.18.2/src/distributed_ls/Euclid/Euclid_apply.c000066400000000000000000000101471355566575400225550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = _ATOL_; 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.18.2/src/distributed_ls/Euclid/Euclid_dh.h000066400000000000000000000141431355566575400220300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/ExternalRows_dh.c000066400000000000000000000445011355566575400232540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/distributed_ls/Euclid/ExternalRows_dh.h000066400000000000000000000057541355566575400232700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/Factor_dh.c000066400000000000000000001067441355566575400220450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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() { } 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) { 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.0; 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.0; } 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.18.2/src/distributed_ls/Euclid/Hash_i_dh.c000066400000000000000000000146161355566575400220160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.0; } 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.18.2/src/distributed_ls/Euclid/Makefile000066400000000000000000000043221355566575400214350ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/distributed_ls/Euclid/MatGenFD.c000066400000000000000000000611071355566575400215320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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*fabs(tmp->a); tmp->b = -1*fabs(tmp->b); tmp->c = -1*fabs(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, naborx2, nabory1, nabory2; 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) { return coeff; } HYPRE_Real e2_xy(HYPRE_Real coeff, HYPRE_Real x, HYPRE_Real y, HYPRE_Real z) { return 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) { 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, naborx2, nabory1, nabory2, 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.18.2/src/distributed_ls/Euclid/Mat_dh.c000066400000000000000000001251441355566575400213430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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) { 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) { START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Mat_dhRowPermute" void Mat_dhRowPermute(Mat_dh 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) { 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.18.2/src/distributed_ls/Euclid/Mem_dh.h000066400000000000000000000015641355566575400213440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/Numbering_dh.c000066400000000000000000000127471355566575400225540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/distributed_ls/Euclid/Numbering_dh.h000066400000000000000000000036651355566575400225600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/Parser_dh.c000066400000000000000000000205131355566575400220500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = 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.18.2/src/distributed_ls/Euclid/Parser_dh.h000066400000000000000000000052671355566575400220660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, char *in, char **out); extern bool Parser_dhReadInt(Parser_dh p, char *in, HYPRE_Int *out); extern bool Parser_dhReadDouble(Parser_dh p, 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, char *name, 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, 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.18.2/src/distributed_ls/Euclid/README.hypre000066400000000000000000000053001355566575400220000ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/SortedList_dh.c000066400000000000000000000270611355566575400227150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = fabs(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.18.2/src/distributed_ls/Euclid/SortedList_dh.h000066400000000000000000000062471355566575400227250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/SortedSet_dh.c000066400000000000000000000042721355566575400225340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/distributed_ls/Euclid/SortedSet_dh.h000066400000000000000000000016241355566575400225370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/SubdomainGraph_dh.c000066400000000000000000001556521355566575400235340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = 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, 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) { 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) { 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.18.2/src/distributed_ls/Euclid/SubdomainGraph_dh.h000066400000000000000000000113471355566575400235310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/TimeLog_dh.c000066400000000000000000000070441355566575400221600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/distributed_ls/Euclid/TimeLog_dh.h000066400000000000000000000016271355566575400221660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/Timer_dh.c000066400000000000000000000116741355566575400217040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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) { START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhStop" void Timer_dhStop(Timer_dh t) { START_FUNC_DH END_FUNC_DH } #undef __FUNC__ #define __FUNC__ "Timer_dhReadWall" HYPRE_Real Timer_dhReadWall(Timer_dh t) { START_FUNC_DH END_FUNC_VAL(-1.0) } #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); } #endif hypre-2.18.2/src/distributed_ls/Euclid/Timer_dh.h000066400000000000000000000050001355566575400216730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/Vec_dh.c000066400000000000000000000157571355566575400213470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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; 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.18.2/src/distributed_ls/Euclid/Vec_dh.h000066400000000000000000000026601355566575400213410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/_hypre_Euclid.h000066400000000000000000001760361355566575400227350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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 #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 malloc #define PRIVATE_FREE free /*------------------ 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 #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 #ifdef HYPRE_SINGLE #define _ATOL_ 1.0e-16 /* used to compute absolute tolerance for Euclid's internal Krylov solvers */ #define _MATLAB_ZERO_ 1e-30 /* used in Mat_SEQ_PrintTriples, so matlab won't discard zeros (yuck!) */ #else // default #define _ATOL_ 1.0e-50 #define _MATLAB_ZERO_ 1e-100 #endif /*---------------------------------------------------------------------- * 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 */ #ifndef COMMON_DH #define COMMON_DH #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; */ /*--------------------------------------------------------------------- * misc. *---------------------------------------------------------------------*/ #if defined(__cplusplus) #else typedef HYPRE_Int bool; #define true 1 #define false 0 #endif /* ------------------------------------------------------------------ * 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) #if defined(HYPRE_USING_RAJA) || defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_CUDA) static char msgBuf_dh[MSG_BUF_SIZE_DH]; #else extern char msgBuf_dh[MSG_BUF_SIZE_DH]; #endif /* 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(); 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(); /* deletes global objects */ extern bool EuclidIsInitialized(); 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 /* 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 #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 #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 #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 #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 #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 /* 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 #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 #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 #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 #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 /* 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 #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 #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 #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 #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 #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 #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 #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 #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 */ #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 /* 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(); /* 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 #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.18.2/src/distributed_ls/Euclid/blas_dh.c000066400000000000000000000065131355566575400215410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = sqrt(result); END_FUNC_VAL(result) } hypre-2.18.2/src/distributed_ls/Euclid/blas_dh.h000066400000000000000000000023701355566575400215430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/euclid_common.h000066400000000000000000000135101355566575400227620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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(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 #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; */ /*--------------------------------------------------------------------- * misc. *---------------------------------------------------------------------*/ #if defined(__cplusplus) #else typedef HYPRE_Int bool; #define true 1 #define false 0 #endif /* ------------------------------------------------------------------ * 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(char *msg, char *function, char *file, HYPRE_Int line); extern void setError_dh(char *msg, char *function, 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(); 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(char *function, char *file, HYPRE_Int line, HYPRE_Int priority); extern void dh_EndFunc(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(); /* deletes global objects */ extern bool EuclidIsInitialized(); extern void printf_dh(char *fmt, ...); extern void fprintf_dh(FILE *fp, 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.18.2/src/distributed_ls/Euclid/euclid_config.h000066400000000000000000000071031355566575400227400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 malloc #define PRIVATE_FREE free /*------------------ 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.18.2/src/distributed_ls/Euclid/getRow_dh.c000066400000000000000000000240231355566575400220630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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, 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, 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, m, n; HYPRE_Int 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.18.2/src/distributed_ls/Euclid/getRow_dh.h000066400000000000000000000017531355566575400220750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/globalObjects.c000066400000000000000000000261611355566575400227200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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(); /* 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; #if defined(HYPRE_USING_RAJA) || defined(HYPRE_USING_KOKKOS) || defined(HYPRE_USING_CUDA) #else char msgBuf_dh[MSG_BUF_SIZE_DH]; /* for internal use */ #endif 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(); 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() { 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) { 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) { 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() { 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() { 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 <<@ #ifndef hypre_EUCLID_HEADER #define hypre_EUCLID_HEADER #define USING_MPI #define HYPRE_GET_ROW #define HYPRE_MODE #define OPTIMIZED_DH #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.18.2/src/distributed_ls/Euclid/ilu_dh.h000066400000000000000000000025011355566575400214070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/ilu_mpi_bj.c000066400000000000000000000231001355566575400222450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; float 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 (fabs(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.18.2/src/distributed_ls/Euclid/ilu_seq.c000066400000000000000000000604411355566575400216060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 || fabs(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 (fabs(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, beta_1, widget, widget_1, rho_1, rho_2, 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, 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, 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.18.2/src/distributed_ls/Euclid/krylov_dh.h000066400000000000000000000014131355566575400221450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/macros_dh.h000066400000000000000000000115451355566575400221120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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!) */ #ifdef HYPRE_SINGLE #define _MATLAB_ZERO_ 1e-30 #else // default #define _MATLAB_ZERO_ 1e-100 #endif /*---------------------------------------------------------------------- * 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.18.2/src/distributed_ls/Euclid/mat_dh_private.c000066400000000000000000001313631355566575400231350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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) { 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; 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.18.2/src/distributed_ls/Euclid/mat_dh_private.h000066400000000000000000000120731355566575400231360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/shellSort_dh.c000066400000000000000000000034751355566575400226030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/distributed_ls/Euclid/shellSort_dh.h000066400000000000000000000014561355566575400226050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/Euclid/sig_dh.c000066400000000000000000000060311355566575400213750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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(); 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() { 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.18.2/src/distributed_ls/Makefile000066400000000000000000000016131355566575400202300ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/distributed_ls/ParaSails/000077500000000000000000000000001355566575400204465ustar00rootroot00000000000000hypre-2.18.2/src/distributed_ls/ParaSails/CMakeLists.txt000066400000000000000000000007701355566575400232120ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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(PARASAILS_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 ) convert_filenames_to_full_paths(PARASAILS_SRCS) set(SRCS ${SRCS} ${PARASAILS_SRCS} PARENT_SCOPE) hypre-2.18.2/src/distributed_ls/ParaSails/Common.h000066400000000000000000000026231355566575400220520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/ConjGrad.c000066400000000000000000000111231355566575400222770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, 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); } free(p); free(s); /* 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); free(r); if (mype == 0) hypre_printf("Iter (%4d): computed rrn : %e\n", i, sqrt(i_prod/bi_prod)); } hypre-2.18.2/src/distributed_ls/ParaSails/ConjGrad.h000066400000000000000000000015541355566575400223130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/DiagScale.c000066400000000000000000000213741355566575400224350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 / 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); free(replies_list); 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); free(requests); 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]; free(ind); free(p->ext_diags); p->ext_diags = temp; /* Wait for all sends */ hypre_MPI_Waitall(num_replies, requests2, statuses); free(requests2); MemDestroy(mem); free(statuses); return p; } /*-------------------------------------------------------------------------- * DiagScaleDestroy - Destroy a diagonal scale object. *--------------------------------------------------------------------------*/ void DiagScaleDestroy(DiagScale *p) { free(p->local_diags); free(p->ext_diags); free(p); } /*-------------------------------------------------------------------------- * 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.18.2/src/distributed_ls/ParaSails/DiagScale.h000066400000000000000000000020561355566575400224360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/FGmres.c000066400000000000000000000133661355566575400220060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 / sqrt( 1.0 + temp*temp ); *cs = temp * *sn; } else { HYPRE_Real temp = dy / dx; *cs = 1.0 / 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 = 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) = 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 = 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); free(H); free(s); free(cs); free(sn); free(V); free(W); } hypre-2.18.2/src/distributed_ls/ParaSails/Hash.c000066400000000000000000000117531355566575400215040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); free(h->table); free(h->data); free(h); } /*-------------------------------------------------------------------------- * 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) { 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.18.2/src/distributed_ls/ParaSails/LoadBal.c000066400000000000000000000325221355566575400221140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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; } } } } } free(cost); } /*-------------------------------------------------------------------------- * 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; } free(buffer); } } /*-------------------------------------------------------------------------- * 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); free(donor_data_pe); free(donor_data_cost); LoadBalRecipRecv(comm, numb, p->num_taken, p->recip_data); hypre_MPI_Waitall(p->num_given, requests, statuses); free(requests); free(statuses); /* Free the send buffers which were allocated by LoadBalDonorSend */ for (i=0; inum_given; i++) free(p->donor_data[i].buffer); 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); free(requests); free(statuses); /* Free the send buffers which were allocated by LoadBalRecipSend */ for (i=0; inum_taken; i++) free(p->recip_data[i].buffer); free(p->donor_data); free(p->recip_data); free(p); } hypre-2.18.2/src/distributed_ls/ParaSails/LoadBal.h000066400000000000000000000024241355566575400221170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/Makefile000066400000000000000000000033651355566575400221150ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/distributed_ls/ParaSails/Matrix.c000066400000000000000000000617211355566575400220650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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]); free(mat->recv_req); free(mat->send_req); free(mat->recv_req2); free(mat->send_req2); free(mat->statuses); free(mat->sendind); free(mat->sendbuf); free(mat->recvbuf); MemDestroy(mat->mem); if (mat->numb) NumberingDestroy(mat->numb); free(mat); } /*-------------------------------------------------------------------------- * 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); if (val != NULL) hypre_TMemcpy(mat->vals[row], val, HYPRE_Real, len, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); } /*-------------------------------------------------------------------------- * 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")); 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"); assert(file != NULL); fgets(line, 100, file); #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); fgets(line, 100, file); #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"); 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); 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"); assert(file != NULL); fgets(line, 100, file); converted = hypre_sscanf(line, "%d %d", &num_rows, &dummy); 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) { free(buffer); buflen = num_local; buffer = hypre_TAlloc(HYPRE_Real, buflen , HYPRE_MEMORY_HOST); } for (i=0; icomm); } free(buffer); } /*-------------------------------------------------------------------------- * 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); free(requests); free(statuses); /* 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); free(outlist); free(inlist); /* 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.18.2/src/distributed_ls/ParaSails/Matrix.h000066400000000000000000000042621355566575400220670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/Mem.c000066400000000000000000000116501355566575400213330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include "Common.h" #include "Mem.h" /*-------------------------------------------------------------------------- * MemCreate - Return (a pointer to) a memory pool object. *--------------------------------------------------------------------------*/ Mem *MemCreate() { 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++) free(m->blocks[i]); free(m); } /*-------------------------------------------------------------------------- * 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.18.2/src/distributed_ls/ParaSails/Mem.h000066400000000000000000000020241355566575400213330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 MemDestroy(Mem *m); char *MemAlloc(Mem *m, HYPRE_Int size); void MemStat(Mem *m, FILE *stream, char *msg); #endif /* _MEM_H */ hypre-2.18.2/src/distributed_ls/ParaSails/Numbering.c000066400000000000000000000160531355566575400225450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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) { free(numb->local_to_global); HashDestroy(numb->hash); free(numb); } /*-------------------------------------------------------------------------- * 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_Int *) realloc(numb->local_to_global, (numb->num_loc+numb->size)*sizeof(HYPRE_Int)); 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.18.2/src/distributed_ls/ParaSails/Numbering.h000066400000000000000000000025461355566575400225540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/OrderStat.c000066400000000000000000000067011355566575400225250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/OrderStat.h000066400000000000000000000014401355566575400225250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/ParaSails.c000066400000000000000000002006471355566575400225020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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) { free(*buffer); *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); free(replies_list); 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); free(replies_list); 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); free(replies_list); 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); free(replies_list); 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); nnz += len; (*costp) += (HYPRE_Real) len*len*len; } #if 0 { 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 nnz = 0; HYPRE_Int npes; 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); nnz += len; (*costp) += (HYPRE_Real) len*len*len; } #if 0 { 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_Real time0, time1, timet = 0.0, timea = 0.0; HYPRE_Real ahatcost = 0.0; HYPRE_Real error = 0; #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; HYPRE_Real time0, time1, timet = 0.0, timea = 0.0; 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++) { time0 = hypre_MPI_Wtime(); /* 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) { free(ahat); 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) { free(bhat); 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]; 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) { free(buffer); 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) { free(buffer); 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); free(ps->beg_rows); free(ps->end_rows); free(ps); } /*-------------------------------------------------------------------------- * 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 #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); free(p->len); free(p->ind); free(p); } /*-------------------------------------------------------------------------- * 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.18.2/src/distributed_ls/ParaSails/PrunedRows.h000066400000000000000000000023231355566575400227270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/RowPatt.c000066400000000000000000000142451355566575400222200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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) { free(p->ind); free(p->mark); free(p->buffer); free(p); } /*-------------------------------------------------------------------------- * 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) { 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) { 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) { free(p->buffer); 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) { free(p->buffer); 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.18.2/src/distributed_ls/ParaSails/RowPatt.h000066400000000000000000000023771355566575400222300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/StoredRows.c000066400000000000000000000122271355566575400227310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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); free(p->len); free(p->ind); free(p->val); free(p); } /*-------------------------------------------------------------------------- * 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 */ 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.18.2/src/distributed_ls/ParaSails/StoredRows.h000066400000000000000000000026721355566575400227410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/convert.c000066400000000000000000000057451355566575400223050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 beg_row, end_row, row, dummy; HYPRE_Int len, *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, 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 *diag_sizes, *offdiag_sizes, local_row, i, j; HYPRE_Int size; HYPRE_Int *col_inds; 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_Int *) 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.18.2/src/distributed_ls/ParaSails/hypre_ParaSails.h000066400000000000000000000030561355566575400237110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/ParaSails/permute.c000066400000000000000000000057171355566575400223050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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; /* 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 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.18.2/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver.c000066400000000000000000000402651355566575400267260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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; lr = NULL; jw = NULL; w = NULL; /* 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 ) { 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_DistributedMatrixPilutSolverSetup *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_DistributedMatrixPilutSolverSetup( HYPRE_DistributedMatrixPilutSolver in_ptr ) { HYPRE_Int m, n, nprocs, start, end, *rowdist, col0, coln, ierr; 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 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.18.2/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_protos.h000066400000000000000000000032671355566575400303420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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-2.18.2/src/distributed_ls/pilut/HYPRE_DistributedMatrixPilutSolver_types.h000066400000000000000000000013761355566575400301570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/pilut/Makefile000066400000000000000000000036741355566575400213760ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/distributed_ls/pilut/comm.c000066400000000000000000000063601355566575400210300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/pilut/const.h000066400000000000000000000017311355566575400212250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/pilut/debug.c000066400000000000000000000155201355566575400211610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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(char *str, hypre_PilutSolverGlobals *globals) { 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) { static HYPRE_Int numChk = 0; HYPRE_Int i; hypre_ulongint sum = 0; for (i=0; irmat_rnz == NULL || rmat->rmat_rrowlen == NULL || rmat->rmat_rcolind == NULL || rmat->rmat_rvalues == NULL ) { hypre_printf("PE %d [r%3d] rmat checksum -- not initializied\n", mype, numChk); fflush(stdout); numChk++; return 0; } /* 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 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]; } 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 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.18.2/src/distributed_ls/pilut/distributed_qsort_si.c000066400000000000000000000230341355566575400243370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_ls/pilut/ilu.h000066400000000000000000000013321355566575400206650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include "macros.h" #include "struct.h" #include "const.h" #endif hypre-2.18.2/src/distributed_ls/pilut/ilut.c000066400000000000000000000127451355566575400210560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; ReduceMatType rmat; HYPRE_Int dummy_row_ptr[2], size; HYPRE_Real *values; #ifdef HYPRE_DEBUG 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= (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.18.2/src/distributed_ls/pilut/parilut.c000066400000000000000000001306701355566575400215570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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(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; 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) { if (cinfo->incolind) { free(cinfo->incolind); cinfo->incolind = NULL; } if (cinfo->invalues) { free(cinfo->invalues); cinfo->invalues = NULL; } 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; } assert( cinfo->incolind != NULL ); 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) { if(cinfo->srowind) { free(cinfo->srowind); cinfo->srowind = NULL; } cinfo->srowind = hypre_idx_malloc(maxnsend, "hypre_ComputeCommInfo: cinfo->srowind"); cinfo->maxnsend = maxnsend; } 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++; 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_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_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) lr[lastlr] = (newiperm[rcolind[lastjr]-firstrow] << 1); else { lr[lastlr] = pilut_map[rcolind[lastjr]]; /* map[] == (l<<1) | 1 */ assert(incolind[StripMIS(pilut_map[rcolind[lastjr]])+1] == rcolind[lastjr]); } lastlr++; } jr[rcolind[lastjr]] = lastjr; jw[lastjr] = rcolind[lastjr]; w[lastjr] = rvalues[lastjr]; } assert(lastjr == nnz); 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); assert(jw[jr[k]] == k); mult = w[jr[k]]*dvalues[kk]; w[jr[k]] = mult; if (fabs(mult) < rtol) continue; /* First drop test */ for (l=usrowptr[kk]; l= firstrow && ucolind[l] < lastrow); 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); assert(jw[jr[k]] == k); mult = w[jr[k]]*invalues[start]; w[jr[k]] = mult; if (fabs(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 (fabs(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]])) { assert(incolind[l] < firstrow || incolind[l] >= lastrow); 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_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 assert( rmat != nrmat ); assert( perm != newperm ); 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]; assert(jw[0] == i+firstrow); lastlr = 0; for (lastjr=1; lastjr= firstrow && rcolind[lastjr] < lastrow && newiperm[rcolind[lastjr]-firstrow] < diag) { 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); assert(jw[jr[k]] == k); mult = w[jr[k]]*dvalues[kk]; w[jr[k]] = mult; if (fabs(mult) < rtol) continue; /* First drop test */ for (l=usrowptr[kk]; l= firstrow && ucolind[l] < lastrow && newiperm[ucolind[l]-firstrow] < diag) { assert(IsInMIS(pilut_map[ucolind[l]])); 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)); 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)); } 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 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 fabs(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]; } assert(nz == out_rowlen); } 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]; 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 fabs(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 */ free( rcolind ); rcolind = NULL; free( rvalues ); rvalues = NULL; } /************************************************************************* * 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 */ if (jr) { free(jr); jr = NULL; } jr = hypre_idx_malloc_init(nrows, -1, "hypre_ParILUT: jr"); if (lr) { free(lr); lr = NULL; } lr = hypre_idx_malloc_init(nleft, -1, "hypre_ParILUT: lr"); if (jw) { free(jw); jw = NULL; } jw = hypre_idx_malloc(nleft, "hypre_ParILUT: jw"); if (w) { free(w); w = NULL; } 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.18.2/src/distributed_ls/pilut/parutil.c000066400000000000000000000137071355566575400215600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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(SDOT(&(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.18.2/src/distributed_ls/pilut/serilut.c000066400000000000000000000556631355566575400215760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, *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 */ if (jr) { free(jr); jr = NULL; } jr = hypre_idx_malloc_init(nrows, -1, "hypre_SerILUT: jr"); if (lr) { free(lr); lr = NULL; } lr = hypre_idx_malloc_init(nrows, -1, "hypre_SerILUT: lr"); if (jw) { free(jw); jw = NULL; } jw = hypre_idx_malloc(nrows, "hypre_SerILUT: jw"); if (w) { free(w); w = NULL; } 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_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) 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 (fabs(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, *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_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_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 fabs(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 fabs(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_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 fabs(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 fabs(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.18.2/src/distributed_ls/pilut/struct.h000066400000000000000000000165421355566575400214310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #ifndef true # define true 1 # define false 0 #endif #ifndef bool # ifdef Boolean typedef Boolean bool; # else typedef unsigned char bool; # endif #endif #endif /************************************************************************* * 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.18.2/src/distributed_ls/pilut/trifactor.c000066400000000000000000000503261355566575400220730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; } } 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]; assert( k < ddist->ddist_nrows ); } } /* this last one is to compute (raddr[i+1] - raddr[i]) */ raddr[rnbrpes] = x + k + lnrows; 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) free(rnum); /* 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 fabs(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.18.2/src/distributed_matrix/distributed_matrix.h000066400000000000000000000050711355566575400235370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_matrix/distributed_matrix_ISIS.c000066400000000000000000000121441355566575400243600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; #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.18.2/src/distributed_matrix/distributed_matrix_ISIS.cc000066400000000000000000000121131355566575400245170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/distributed_matrix/distributed_matrix_PETSc.c000066400000000000000000000104651355566575400245330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *distributed_matrix ) { #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(distributed_matrix); MatDestroy( PETSc_matrix ); #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 *matrix ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(matrix); ierr = MatView( PETSc_matrix, VIEWER_STDOUT_WORLD ); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalRangePETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetLocalRangePETSc( hypre_DistributedMatrix *matrix, HYPRE_BigInt *start, HYPRE_BigInt *end ) { HYPRE_Int ierr=0; #ifdef PETSC_AVAILABLE Mat PETSc_matrix = (Mat) hypre_DistributedMatrixLocalStorage(matrix); 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; #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetRowPETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixGetRowPETSc( hypre_DistributedMatrix *matrix, 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(matrix); if (!PETSc_matrix) return(-1); ierr = MatGetRow( PETSc_matrix, row, size, col_ind, values); CHKERRA(ierr); #endif return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixRestoreRowPETSc *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixRestoreRowPETSc( hypre_DistributedMatrix *matrix, 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(matrix); if (PETSc_matrix == NULL) return(-1); ierr = MatRestoreRow( PETSc_matrix, row, size, col_ind, values); CHKERRA(ierr); #endif return(ierr); } hypre-2.18.2/src/distributed_matrix/distributed_matrix_parcsr.c000066400000000000000000000105721355566575400251060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *distributed_matrix ) { return(0); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixInitializeParCSR *--------------------------------------------------------------------------*/ /* matrix must be set before calling this function*/ HYPRE_Int hypre_DistributedMatrixInitializeParCSR(hypre_DistributedMatrix *matrix) { 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 *matrix ) { HYPRE_Int ierr=0; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(matrix); HYPRE_ParCSRMatrixPrint( Parcsr_matrix, "STDOUT" ); return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixGetLocalRangeParCSR *--------------------------------------------------------------------------*/ 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 ierr=0; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(matrix); 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 *matrix, 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(matrix); if (!Parcsr_matrix) return(-1); ierr = HYPRE_ParCSRMatrixGetRow( Parcsr_matrix, row, size, col_ind, values); return(ierr); } /*-------------------------------------------------------------------------- * hypre_DistributedMatrixRestoreRowParCSR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_DistributedMatrixRestoreRowParCSR( hypre_DistributedMatrix *matrix, HYPRE_BigInt row, HYPRE_Int *size, HYPRE_BigInt **col_ind, HYPRE_Real **values ) { HYPRE_Int ierr; HYPRE_ParCSRMatrix Parcsr_matrix = (HYPRE_ParCSRMatrix) hypre_DistributedMatrixLocalStorage(matrix); if (Parcsr_matrix == NULL) return(-1); ierr = HYPRE_ParCSRMatrixRestoreRow( Parcsr_matrix, row, size, col_ind, values); return(ierr); } hypre-2.18.2/src/distributed_matrix/internal_protos.h000066400000000000000000000143621355566575400230560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/000077500000000000000000000000001355566575400144775ustar00rootroot00000000000000hypre-2.18.2/src/docs/Makefile000066400000000000000000000043601355566575400161420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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: html pdf 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 ################################################################## html: usr-html ref-html pdf: usr-pdf ref-pdf usr: usr-html usr-pdf usr-html: @cd usr-manual; make html @mv usr-manual/_build/html usr-manual-html usr-pdf: @cd usr-manual; make latexpdf @mv usr-manual/_build/latex/hypre.pdf usr-manual.pdf ref: ref-html ref-pdf ref-html: @cd ref-manual; make html @mv ref-manual/html ref-manual-html ref-pdf: @cd ref-manual; make pdf @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.18.2/src/docs/copyright.txt000066400000000000000000000002761355566575400172550ustar00rootroot00000000000000Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/hypre-wwords.png000066400000000000000000000711401355566575400176620ustar00rootroot00000000000000‰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.18.2/src/docs/hypre.bib000066400000000000000000000377241355566575400163210ustar00rootroot00000000000000% Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/ref-manual/000077500000000000000000000000001355566575400165265ustar00rootroot00000000000000hypre-2.18.2/src/docs/ref-manual/Makefile000066400000000000000000000015631355566575400201730ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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: html pdf install: clean: @/bin/rm -fr html latex 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.18.2/src/docs/ref-manual/conf.doxygen000066400000000000000000001751051355566575400210630ustar00rootroot00000000000000# Doxyfile 1.5.7.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a 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 (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config 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 # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the 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.18.2 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # 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 # 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 cause performance problems for the file system. CREATE_SUBDIRS = 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. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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. BRIEF_MEMBER_DESC = NO # If the REPEAT_BRIEF tag is set to YES (the default) 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. 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" "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. 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. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then 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. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then 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. 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 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. 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 # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = 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 comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # 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 behaviour. # 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 behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. 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. 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. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" 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:". # You can put \n's in the value part of an alias to insert newlines. 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. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. 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. OPTIMIZE_OUTPUT_VHDL = NO # 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); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip 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. 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 (the default) # 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. 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. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) 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. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT 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. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # 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 and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. 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. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included. 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. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) 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. 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 (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. 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 (the default) these blocks will be appended to the # function's detailed documentation block. 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 (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) 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. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = 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 default) # the group names will appear in their defined order. 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 default), 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. SORT_BY_SCOPE_NAME = 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. 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. 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. 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. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of 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 initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. 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. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # 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 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 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 , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. 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. The 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. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED 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. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = 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) WARN_FORMAT = "$file:$line: $text" # 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 stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be 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. 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, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_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 the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = HYPRE*.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # 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. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. 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, # AClass::ANamespace, ANamespace::*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. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are 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. 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 # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # 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 also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. 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. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # 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 documentstion. REFERENCES_LINK_SOURCE = NO # 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 http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) 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. 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. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 4 # 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 one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. 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. If left blank `html' will be used as the default path. 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). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. 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 the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = 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. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # 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, 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 http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # 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. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, 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. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, 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. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, 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. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, 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. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. 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. 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. 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. 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. QHP_VIRTUAL_FOLDER = doc # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file . QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # 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 FRAME, 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 (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NO # 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. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # 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. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO hypre-2.18.2/src/docs/update-release.sh000077500000000000000000000013571355566575400177440ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore National Security, LLC and other # HYPRE Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) usrconf="usr-manual/conf.py" refconf="ref-manual/conf.doxygen" version=`../utilities/version -number` reldate=`../utilities/version -date` usrdate=`date --date=$reldate +'%B %d, %Y'` # User manual sed -e 's/version = .*/version = \x27'$version'\x27/' $usrconf | sed -e 's/release = .*/release = \x27'$version'\x27/' | sed -e 's#today = .*#today = \x27'"$usrdate"'\x27#' > $usrconf.tmp mv $usrconf.tmp $usrconf # Reference manual sed -e 's/PROJECT_NUMBER .*=.*/PROJECT_NUMBER = '$version'/' $refconf > $refconf.tmp mv $refconf.tmp $refconf hypre-2.18.2/src/docs/usr-manual/000077500000000000000000000000001355566575400165635ustar00rootroot00000000000000hypre-2.18.2/src/docs/usr-manual/Makefile000066400000000000000000000126701355566575400202310ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/hypre.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/hypre.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/hypre" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/hypre" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." hypre-2.18.2/src/docs/usr-manual/_static/000077500000000000000000000000001355566575400202115ustar00rootroot00000000000000hypre-2.18.2/src/docs/usr-manual/_static/custom.css000066400000000000000000000004771355566575400222450ustar00rootroot00000000000000/* This file intentionally left blank. */ /* Move Georgia first to get better rendering on Windows platforms */ body { font-family: Georgia, 'goudy old style', 'minion pro', 'bell mt', 'Hiragino Mincho Pro', serif; font-size: 17px; background-color: #fff; color: #000; margin: 0; padding: 0; } hypre-2.18.2/src/docs/usr-manual/ch-fei.rst000066400000000000000000000164361355566575400204620ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _ch-FEI: ****************************************************************************** Finite Element Interface ****************************************************************************** Introduction ============================================================================== Many application codes use unstructured finite element meshes. This section describes an interface for finite element problems, called the FEI, which is supported in hypre. .. figure:: figSquareHole.* :align: center Example of an unstructured mesh. FEI refers to a specific interface for black-box finite element solvers, originally developed in Sandia National Lab, see [ClEA1999]_. It differs from the rest of the conceptual interfaces in hypre in two important aspects: it is written in C++, and it does not separate the construction of the linear system matrix from the solution process. A complete description of Sandia's FEI implementation can be obtained by contacting Alan Williams at Sandia (william@sandia.gov). A simplified version of the FEI has been implemented at LLNL and is included in hypre. More details about this implementation can be found in the header files of the ``FEI_mv/fei-base`` and ``FEI_mv/fei-hypre`` directories. A Brief Description of the Finite Element Interface ============================================================================== Typically, finite element codes contain data structures storing element connectivities, element stiffness matrices, element loads, boundary conditions, nodal coordinates, etc. One of the purposes of the FEI is to assemble the global linear system in parallel based on such local element data. We illustrate this in the rest of the section and refer to example 10 (in the ``examples`` directory) for more implementation details. In hypre, one creates an instance of the FEI as follows: .. code-block:: c++ LLNL_FEI_Impl *feiPtr = new LLNL_FEI_Impl(mpiComm); Here ``mpiComm`` is an MPI communicator (e.g. ``MPI\_COMM\_WORLD``). If Sandia's FEI package is to be used, one needs to define a hypre solver object first: .. code-block:: c++ LinearSystemCore *solver = HYPRE_base_create(mpiComm); FEI_Implementation *feiPtr = FEI_Implementation(solver,mpiComm,rank); where ``rank`` is the number of the master processor (used only to identify which processor will produce the screen outputs). The ``LinearSystemCore`` class is the part of the FEI that interfaces with the linear solver library. It will be discussed later in Sections :ref:`LSI_solvers` and :ref:`LSI_install`. Local finite element information is passed to the FEI using several methods of the ``feiPtr`` object. The first entity to be submitted is the *field* information. A *field* has an identifier called ``fieldID`` and a rank or ``fieldSize`` (number of degree of freedom). For example, a discretization of the Navier Stokes equations in 3D can consist of velocity vector having :math:`3` degrees of freedom in every node (vertex) of the mesh and a scalar pressure variable, which is constant over each element. If these are the only variables, and if we assign ``fieldID`` :math:`7` and :math:`8` to them, respectively, then the finite element field information can be set up by .. code-block:: c++ nFields = 2; /* number of unknown fields */ fieldID = new int[nFields]; /* field identifiers */ fieldSize = new int[nFields]; /* vector dimension of each field */ /* velocity (a 3D vector) */ fieldID[0] = 7; fieldSize[0] = 3; /* pressure (a scalar function) */ fieldID[1] = 8; fieldSize[1] = 1; feiPtr -> initFields(nFields, fieldSize, fieldID); Once the field information has been established, we are ready to initialize an element block. An element block is characterized by the block identifier, the number of elements, the number of nodes per element, the nodal fields and the element fields (fields that have been defined previously). Suppose we use :math:`1000` hexahedral elements in the element block :math:`0`, the setup consists of .. code-block:: c++ elemBlkID = 0; /* identifier for a block of elements */ nElems = 1000; /* number of elements in the block */ elemNNodes = 8; /* number of nodes per element */ /* nodal-based field for the velocity */ nodeNFields = 1; nodeFieldIDs = new[nodeNFields]; nodeFieldIDs[0] = fieldID[0]; /* element-based field for the pressure */ elemNFields = 1; elemFieldIDs = new[elemNFields]; elemFieldIDs[0] = fieldID[1]; feiPtr -> initElemBlock(elemBlkID, nElems, elemNNodes, nodeNFields, nodeFieldIDs, elemNFields, elemFieldIDs, 0); The last argument above specifies how the dependent variables are arranged in the element matrices. A value of :math:`0` indicates that each variable is to be arranged in a separate block (as opposed to interleaving). In a parallel environment, each processor has one or more element blocks. Unless the element blocks are all disjoint, some of them share a common set of nodes on the subdomain boundaries. To facilitate setting up interprocessor communications, shared nodes between subdomains on different processors are to be identified and sent to the FEI. Hence, each node in the whole domain is assigned a unique global identifier. The shared node list on each processor contains a subset of the global node list corresponding to the local nodes that are shared with the other processors. The syntax for setting up the shared nodes is .. code-block:: c++ feiPtr -> initSharedNodes(nShared, sharedIDs, sharedLengs, sharedProcs); This completes the initialization phase, and a completion signal is sent to the FEI via .. code-block:: c++ feiPtr -> initComplete(); Next, we begin the *load* phase. The first entity for loading is the nodal boundary conditions. Here we need to specify the number of boundary equations and the boundary values given by ``alpha``, ``beta``, and ``gamma``. Depending on whether the boundary conditions are Dirichlet, Neumann, or mixed, the three values should be passed into the FEI accordingly. .. code-block:: c++ feiPtr -> loadNodeBCs(nBCs, BCEqn, fieldID, alpha, beta, gamma); The element stiffness matrices are to be loaded in the next step. We need to specify the element number :math:`i`, the element block to which element :math:`i` belongs, the element connectivity information, the element load, and the element matrix format. The element connectivity specifies a set of :math:`8` node global IDs (for hexahedral elements), and the element load is the load or force for each degree of freedom. The element format specifies how the equations are arranged (similar to the interleaving scheme mentioned above). The calling sequence for loading element stiffness matrices is .. code-block:: c++ for (i = 0; i < nElems; i++) feiPtr -> sumInElem(elemBlkID, elemID, elemConn[i], elemStiff[i], elemLoads[i], elemFormat); To complete the assembling of the global stiffness matrix and the corresponding right hand side, a signal is sent to the FEI via .. code-block:: c++ feiPtr -> loadComplete(); hypre-2.18.2/src/docs/usr-manual/ch-ij.rst000066400000000000000000000243021355566575400203100ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _ch-IJ: ****************************************************************************** Linear-Algebraic System Interface (IJ) ****************************************************************************** The ``IJ`` interface described in this chapter is the lowest common denominator for specifying linear systems in hypre. This interface provides access to general sparse-matrix solvers in hypre, not to the specialized solvers that require more problem information. IJ Matrix Interface ============================================================================== As with the other interfaces in hypre, the ``IJ`` interface expects to get data in distributed form because this is the only scalable approach for assembling matrices on thousands of processes. Matrices are assumed to be distributed by blocks of rows as follows: .. math:: \left[ \begin{array}{c} ~~~~~~~~~~ A_0 ~~~~~~~~~~ \\ A_1 \\ \vdots \\ A_{P-1} \end{array} \right] In the above example, the matrix is distributed accross the :math:`P` processes, :math:`0, 1, ..., P-1` by blocks of rows. Each submatrix :math:`A_p` is "owned" by a single process and its first and last row numbers are given by the global indices ``ilower`` and ``iupper`` in the ``Create()`` call below. The following example code illustrates the basic usage of the ``IJ`` interface for building matrices: .. code-block:: c MPI_Comm comm; HYPRE_IJMatrix ij_matrix; HYPRE_ParCSRMatrix parcsr_matrix; int ilower, iupper; int jlower, jupper; int nrows; int *ncols; int *rows; int *cols; double *values; HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &ij_matrix); HYPRE_IJMatrixSetObjectType(ij_matrix, HYPRE_PARCSR); HYPRE_IJMatrixInitialize(ij_matrix); /* set matrix coefficients */ HYPRE_IJMatrixSetValues(ij_matrix, nrows, ncols, rows, cols, values); ... /* add-to matrix cofficients, if desired */ HYPRE_IJMatrixAddToValues(ij_matrix, nrows, ncols, rows, cols, values); ... HYPRE_IJMatrixAssemble(ij_matrix); HYPRE_IJMatrixGetObject(ij_matrix, (void **) &parcsr_matrix); The ``Create()`` routine creates an empty matrix object that lives on the ``comm`` communicator. This is a collective call (i.e., must be called on all processes from a common synchronization point), with each process passing its own row extents, ``ilower`` and ``iupper``. The row partitioning must be contiguous, i.e., ``iupper`` for process ``i`` must equal ``ilower``:math:`-1` for process ``i``:math:`+1`. Note that this allows matrices to have 0- or 1-based indexing. The parameters ``jlower`` and ``jupper`` define a column partitioning, and should match ``ilower`` and ``iupper`` when solving square linear systems. See the Reference Manual for more information. The ``SetObjectType()`` routine sets the underlying matrix object type to ``HYPRE_PARCSR`` (this is the only object type currently supported). The ``Initialize()`` routine indicates that the matrix coefficients (or values) are ready to be set. This routine may or may not involve the allocation of memory for the coefficient data, depending on the implementation. The optional ``SetRowSizes()`` and ``SetDiagOffdSizes()`` routines mentioned later in this chapter and in the Reference Manual, should be called before this step. The ``SetValues()`` routine sets matrix values for some number of rows (``nrows``) and some number of columns in each row (``ncols``). The actual row and column numbers of the matrix ``values`` to be set are given by ``rows`` and ``cols``. The coefficients can be modified with the ``AddToValues()`` routine. If ``AddToValues()`` is used to add to a value that previously didn't exist, it will set this value. Note that while ``AddToValues()`` will add to values on other processors, ``SetValues()`` does not set values on other processors. Instead if a user calls ``SetValues()`` on processor :math:`i` to set a matrix coefficient belonging to processor :math:`j`, processor :math:`i` will erase all previous occurrences of this matrix coefficient, so they will not contribute to this coefficient on processor :math:`j`. The actual coefficient has to be set on processor :math:`j`. The ``Assemble()`` routine is a collective call, and finalizes the matrix assembly, making the matrix "ready to use". The ``GetObject()`` routine retrieves the built matrix object so that it can be passed on to hypre solvers that use the ``ParCSR`` internal storage format. Note that this is not an expensive routine; the matrix already exists in ``ParCSR`` storage format, and the routine simply returns a "handle" or pointer to it. Although we currently only support one underlying data storage format, in the future several different formats may be supported. One can preset the row sizes of the matrix in order to reduce the execution time for the matrix specification. One can specify the total number of coefficients for each row, the number of coefficients in the row that couple the diagonal unknown to (``Diag``) unknowns in the same processor domain, and the number of coefficients in the row that couple the diagonal unknown to (``Offd``) unknowns in other processor domains: .. code-block:: c HYPRE_IJMatrixSetRowSizes(ij_matrix, sizes); HYPRE_IJMatrixSetDiagOffdSizes(matrix, diag_sizes, offdiag_sizes); Once the matrix has been assembled, the sparsity pattern cannot be altered without completely destroying the matrix object and starting from scratch. However, one can modify the matrix values of an already assembled matrix. To do this, first call the ``Initialize()`` routine to re-initialize the matrix, then set or add-to values as before, and call the ``Assemble()`` routine to re-assemble before using the matrix. Re-initialization and re-assembly are very cheap, essentially a no-op in the current implementation of the code. IJ Vector Interface ============================================================================== The following example code illustrates the basic usage of the ``IJ`` interface for building vectors: .. code-block:: c MPI_Comm comm; HYPRE_IJVector ij_vector; HYPRE_ParVector par_vector; int jlower, jupper; int nvalues; int *indices; double *values; HYPRE_IJVectorCreate(comm, jlower, jupper, &ij_vector); HYPRE_IJVectorSetObjectType(ij_vector, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_vector); /* set vector values */ HYPRE_IJVectorSetValues(ij_vector, nvalues, indices, values); ... HYPRE_IJVectorAssemble(ij_vector); HYPRE_IJVectorGetObject(ij_vector, (void **) &par_vector); The ``Create()`` routine creates an empty vector object that lives on the ``comm`` communicator. This is a collective call, with each process passing its own index extents, ``jlower`` and ``jupper``. The names of these extent parameters begin with a ``j`` because we typically think of matrix-vector multiplies as the fundamental operation involving both matrices and vectors. For matrix-vector multiplies, the vector partitioning should match the column partitioning of the matrix (which also uses the ``j`` notation). For linear system solves, these extents will typically match the row partitioning of the matrix as well. The ``SetObjectType()`` routine sets the underlying vector storage type to ``HYPRE_PARCSR`` (this is the only storage type currently supported). The ``Initialize()`` routine indicates that the vector coefficients (or values) are ready to be set. This routine may or may not involve the allocation of memory for the coefficient data, depending on the implementation. The ``SetValues()`` routine sets the vector ``values`` for some number (``nvalues``) of ``indices``. The values can be modified with the ``AddToValues()`` routine. Note that while ``AddToValues()`` will add to values on other processors, ``SetValues()`` does not set values on other processors. Instead if a user calls ``SetValues()`` on processor :math:`i` to set a value belonging to processor :math:`j`, processor :math:`i` will erase all previous occurrences of this matrix coefficient, so they will not contribute to this value on processor :math:`j`. The actual value has to be set on processor :math:`j`. The ``Assemble()`` routine is a trivial collective call, and finalizes the vector assembly, making the vector "ready to use". The ``GetObject()`` routine retrieves the built vector object so that it can be passed on to hypre solvers that use the ``ParVector`` internal storage format. Vector values can be modified in much the same way as with matrices by first re-initializing the vector with the ``Initialize()`` routine. A Scalable Interface ============================================================================== As explained in the previous sections, problem data is passed to the hypre library in its distributed form. However, as is typically the case for a parallel software library, some information regarding the global distribution of the data will be needed for hypre to perform its function. In particular, a solver algorithm requires that a processor obtain "nearby" data from other processors in order to complete the solve. While a processor may easily determine what data it needs from other processors, it may not know which processor owns the data it needs. Therefore, processors must determine their communication partners, or neighbors. The straightforward approach to determining neighbors involves constructing a global partition of the data. This approach, however, requires :math:`O(P)` storage and computations and is not scalable for machines with tens of thousands of processors. The *assumed partition* algorithm was developed to address this problem [BaFY2006]_. It is used by default in hypre and is recommended in general. For modest numbers of processors (less than a hundred or so), a global partition may produce slightly faster results and can be turned on by compiling the library as detailed in Section :ref:`config_options`. hypre-2.18.2/src/docs/usr-manual/ch-intro.rst000066400000000000000000000331601355566575400210430ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _introduction: ****************************************************************************** Introduction ****************************************************************************** This manual describes hypre, a software library of high performance preconditioners and solvers for the solution of large, sparse linear systems of equations on massively parallel computers [FaJY2004]_. The hypre library was created with the primary goal of providing users with advanced parallel preconditioners. The library features parallel multigrid solvers for both structured and unstructured grid problems. For ease of use, these solvers are accessed from the application code via hypre's conceptual linear system interfaces [FaJY2005]_ (abbreviated to *conceptual interfaces* throughout much of this manual), which allow a variety of natural problem descriptions. This introductory chapter provides an overview of the various features in hypre, discusses further sources of information on hypre, and offers suggestions on how to get started. .. _features: Overview of Features ============================================================================== **Scalable preconditioners provide efficient solution on today's and tomorrow's systems:** hypre contains several families of preconditioner algorithms focused on the scalable solution of *very large* sparse linear systems. (Note that small linear systems, systems that are solvable on a sequential computer, and dense systems are all better addressed by other libraries that are designed specifically for them.) hypre includes "grey box" algorithms that use more than just the matrix to solve certain classes of problems more efficiently than general-purpose libraries. This includes algorithms such as structured multigrid. **Suite of common iterative methods provides options for a spectrum of problems:** hypre provides several of the most commonly used Krylov-based iterative methods to be used in conjunction with its scalable preconditioners. This includes methods for nonsymmetric systems such as GMRES and methods for symmetric matrices such as Conjugate Gradient. **Intuitive grid-centric interfaces obviate need for complicated data structures and provide access to advanced solvers:** hypre has made a major step forward in usability from earlier generations of sparse linear solver libraries in that users do not have to learn complicated sparse matrix data structures. Instead, hypre does the work of building these data structures for the user through a variety of conceptual interfaces, each appropriate to different classes of users. These include stencil-based structured/semi-structured interfaces most appropriate for finite-difference applications; a finite-element based unstructured interface; and a linear-algebra based interface. Each conceptual interface provides access to several solvers without the need to write new interface code. **User options accommodate beginners through experts:** hypre allows a spectrum of expertise to be applied by users. The beginning user can get up and running with a minimal amount of effort. More expert users can take further control of the solution process through various parameters. **Configuration options to suit your computing system:** hypre allows a simple and flexible installation on a wide variety of computing systems. Users can tailor the installation to match their computing system. Options include debug and optimized modes, the ability to change required libraries such as MPI and BLAS, a sequential mode, and modes enabling threads for certain solvers. On most systems, however, hypre can be built by simply typing ``configure`` followed by ``make``, or by using CMake [CMakeWeb]_. **Interfaces in multiple languages provide greater flexibility for applications:** hypre is written in C (with the exception of the FEI interface, which is written in C++) and provides an interface for Fortran users. .. _more-info: Getting More Information ============================================================================== This user's manual consists of chapters describing each conceptual interface, a chapter detailing the various linear solver options available, and detailed installation information. In addition to this manual, a number of other information sources for hypre are available. * **Reference Manual:** The reference manual comprehensively lists all of the interface and solver functions available in hypre. The reference manual is ideal for determining the various options available for a particular solver or for viewing the functions provided to describe a problem for a particular interface. * **Example Problems:** A suite of example problems is provided with the hypre installation. These examples reside in the ``examples`` subdirectory and demonstrate various features of the hypre library. Associated documentation may be accessed by viewing the ``README.html`` file in that same directory. * **Papers, Presentations, etc.:** Articles and presentations related to the hypre software library and the solvers available in the library are available from the hypre web page at `http://www.llnl.gov/CASC/hypre/`_. * **Mailing List:** The mailing list ``hypre-announce`` can be subscribed to through the hypre web page at `http://www.llnl.gov/CASC/hypre/`_. The development team uses this list to announce new releases of hypre. It cannot be posted to by users. .. _http://www.llnl.gov/CASC/hypre/: http://www.llnl.gov/CASC/hypre/ .. _getting-started: How to get started ============================================================================== .. _installing-hypre: Installing hypre ------------------------------------------------------------------------------ As previously noted, on most systems hypre can be built by simply typing ``configure`` followed by ``make`` in the top-level source directory. Alternatively, the CMake system [CMakeWeb]_ can be used, and is the best approach for building hypre on Windows systems in particular. For more detailed instructions, read the ``INSTALL`` file provided with the hypre distribution or refer to the last chapter in this manual. Note the following requirements: * To run in parallel, hypre requires an installation of MPI. * Configuration of hypre with threads requires an implementation of OpenMP. Currently, only a subset of hypre is threaded. * The hypre library currently does not directly support complex-valued systems. .. _choosing-interface: Choosing a conceptual interface ------------------------------------------------------------------------------ An important decision to make before writing any code is to choose an appropriate conceptual interface. These conceptual interfaces are intended to represent the way that applications developers naturally think of their linear problem and to provide natural interfaces for them to pass the data that defines their linear system into hypre. Essentially, these conceptual interfaces can be considered convenient utilities for helping a user build a matrix data structure for hypre solvers and preconditioners. The top row of :ref:`fig-ls-interface` illustrates a number of conceptual interfaces. Generally, the conceptual interfaces are denoted by different types of computational grids, but other application features might also be used, such as geometrical information. For example, applications that use structured grids (such as in the left-most interface in :ref:`fig-ls-interface`) typically view their linear problems in terms of stencils and grids. On the other hand, applications that use unstructured grids and finite elements typically view their linear problems in terms of elements and element stiffness matrices. Finally, the right-most interface is the standard linear-algebraic (matrix rows/columns) way of viewing the linear problem. The hypre library currently supports four conceptual interfaces, and typically the appropriate choice for a given problem is fairly obvious, e.g. a structured-grid interface is clearly inappropriate for an unstructured-grid application. * **Structured-Grid System Interface (Struct):** This interface is appropriate for applications whose grids consist of unions of logically rectangular grids with a fixed stencil pattern of nonzeros at each grid point. This interface supports only a single unknown per grid point. See Chapter :ref:`ch-Struct` for details. * **Semi-Structured-Grid System Interface (SStruct):** This interface is appropriate for applications whose grids are mostly structured, but with some unstructured features. Examples include block-structured grids, composite grids in structured adaptive mesh refinement (AMR) applications, and overset grids. This interface supports multiple unknowns per cell. See Chapter :ref:`ch-SStruct` for details. * **Finite Element Interface (FEI):** This is appropriate for users who form their linear systems from a finite element discretization. The interface mirrors typical finite element data structures, including element stiffness matrices. Though this interface is provided in hypre, its definition was determined elsewhere (please send email to Alan Williams william@sandia.gov for more information). See Chapter :ref:`ch-FEI` for details. * **Linear-Algebraic System Interface (IJ):** This is the traditional linear-algebraic interface. It can be used as a last resort by users for whom the other grid-based interfaces are not appropriate. It requires more work on the user's part, though still less than building parallel sparse data structures. General solvers and preconditioners are available through this interface, but not specialized solvers which need more information. Our experience is that users with legacy codes, in which they already have code for building matrices in particular formats, find the IJ interface relatively easy to use. See Chapter :ref:`ch-IJ` for details. .. _fig-ls-interface: .. figure:: figConcepIface.* :align: center Figure 1 Graphic illustrating the notion of conceptual linear system interfaces. Generally, a user should choose the most specific interface that matches their application, because this will allow them to use specialized and more efficient solvers and preconditioners without losing access to more general solvers. For example, the second row of Figure :ref:`fig-ls-interface` is a set of linear solver algorithms. Each linear solver group requires different information from the user through the conceptual interfaces. So, the geometric multigrid algorithm (GMG) listed in the left-most box, for example, can only be used with the left-most conceptual interface. On the other hand, the ILU algorithm in the right-most box may be used with any conceptual interface. Matrix requirements for each solver and preconditioner are provided in Chapter :ref:`ch-Solvers` and in the hypre Reference Manual. Your desired solver strategy may influence your choice of conceptual interface. A typical user will select a single Krylov method and a single preconditioner to solve their system. The third row of Figure :ref:`fig-ls-interface` is a list of data layouts or matrix/vector storage schemes. The relationship between linear solver and storage scheme is similar to that of the conceptual interface and linear solver. Note that some of the interfaces in hypre currently only support one matrix/vector storage scheme choice. The conceptual interface, the desired solvers and preconditioners, and the matrix storage class must all be compatible. .. _writing-your-code: Writing your code ------------------------------------------------------------------------------ As discussed in the previous section, the following decisions should be made before writing any code: * Choose a conceptual interface. * Choose your desired solver strategy. * Look up matrix requirements for each solver and preconditioner. * Choose a matrix storage class that is compatible with your solvers and preconditioners and your conceptual interface. Once the previous decisions have been made, it is time to code your application to call hypre. At this point, reviewing the previously mentioned example codes provided with the hypre library may prove very helpful. The example codes demonstrate the following general structure of the application calls to hypre: * **Build any necessary auxiliary structures for your chosen conceptual interface.** This includes, e.g., the grid and stencil structures if you are using the structured-grid interface. * **Build the matrix, solution vector, and right-hand-side vector through your chosen conceptual interface.** Each conceptual interface provides a series of calls for entering information about your problem into hypre. * **Build solvers and preconditioners and set solver parameters (optional).** Some parameters like convergence tolerance are the same across solvers, while others are solver specific. * **Call the solve function for the solver.** * **Retrieve desired information from solver.** Depending on your application, there may be different things you may want to do with the solution vector. Also, performance information such as number of iterations is typically available, though it may differ from solver to solver. The subsequent chapters of this User's Manual provide the details needed to more fully understand the function of each conceptual interface and each solver. Remember that a comprehensive list of all available functions is provided in the hypre Reference Manual, and the provided example codes may prove helpful as templates for your specific application. hypre-2.18.2/src/docs/usr-manual/ch-misc.rst000066400000000000000000000411541355566575400206450ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore National Security, LLC and other HYPRE Project Developers. See the top-level COPYRIGHT file for details. SPDX-License-Identifier: (Apache-2.0 OR MIT) .. _ch-General: ****************************************************************************** General Information ****************************************************************************** Getting the Source Code ============================================================================== The hypre distribution tar file is available from the Software link of the hypre web page, http://www.llnl.gov/CASC/hypre/. The hypre Software distribution page allows access to the tar files of the latest and previous general and beta distributions as well as documentation. Building the Library ============================================================================== In this and the following several sections, we discuss the steps to install and use hypre on a Unix-like operating system, such as Linux, AIX, and Mac OS X. Alternatively, the CMake build system [CMakeWeb]_ can be used, and is the best approach for building hypre on Windows systems in particular (see the ``INSTALL`` file for details). After unpacking the hypre tar file, the source code will be in the ``src`` sub-directory of a directory named hypre-VERSION, where VERSION is the current version number (e.g., hypre-1.8.4, with a "b" appended for a beta release). Move to the ``src`` sub-directory to build hypre for the host platform. The simplest method is to configure, compile and install the libraries in ``./hypre/lib`` and ``./hypre/include`` directories, which is accomplished by: .. code-block:: bash ./configure make NOTE: when executing on an IBM platform ``configure`` must be executed under the nopoe script (``./nopoe ./configure >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.18.2/src/docs/usr-manual/figSStructExample3a.svg000066400000000000000000001076001355566575400231450ustar00rootroot00000000000000 image/svg+xmlpart 0part 1part 2part 3part 4part 5 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructExample3b.pdf000066400000000000000000000725651355566575400231330ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructExample3b.svg000066400000000000000000001655301355566575400231540ustar00rootroot00000000000000 image/svg+xml01230123 hypre-2.18.2/src/docs/usr-manual/figSStructExample3c.pdf000066400000000000000000000402731355566575400231230ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructExample3c.svg000066400000000000000000001215651355566575400231550ustar00rootroot00000000000000 image/svg+xmlpart 0part 1part 2part 3part 4part 5 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructGraph1.pdf000066400000000000000000000057001355566575400224200ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGraph1.svg000066400000000000000000001037221355566575400224510ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figSStructGraph2.pdf000066400000000000000000000040161355566575400224200ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGraph2.svg000066400000000000000000000553251355566575400224570ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figSStructGraph3.pdf000066400000000000000000000054431355566575400224260ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGraph3.svg000066400000000000000000000742071355566575400224600ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figSStructGraph4.pdf000066400000000000000000000070561355566575400224310ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGraph4.svg000066400000000000000000001130541355566575400224530ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figSStructGraph5.pdf000066400000000000000000000070221355566575400224230ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGraph5.svg000066400000000000000000001123741355566575400224600ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figSStructGrid1.pdf000066400000000000000000000212641355566575400222470ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid1.svg000066400000000000000000000455361355566575400223050ustar00rootroot00000000000000 image/svg+xml(1,1) (1,4) (4,1) (4,4) (1,1) (4,4) part 2 part 3 part 4 hypre-2.18.2/src/docs/usr-manual/figSStructGrid2.pdf000066400000000000000000000157411355566575400222530ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid2.svg000066400000000000000000000332271355566575400223000ustar00rootroot00000000000000 image/svg+xml(1,1) (4,4) part 3 (1,1) (4,4) part 3 hypre-2.18.2/src/docs/usr-manual/figSStructGrid3.pdf000066400000000000000000000162421355566575400222510ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid3.svg000066400000000000000000000434661355566575400223070ustar00rootroot00000000000000 image/svg+xml(1,1) (4,4) part 3 (1,1)(4,4) part 3 hypre-2.18.2/src/docs/usr-manual/figSStructGrid4.pdf000066400000000000000000000201501355566575400222430ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid4.svg000066400000000000000000000627131355566575400223040ustar00rootroot00000000000000 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.18.2/src/docs/usr-manual/figSStructGrid5.pdf000066400000000000000000000217151355566575400222540ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid5.svg000066400000000000000000001046001355566575400222750ustar00rootroot00000000000000 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.18.2/src/docs/usr-manual/figSStructGrid6.pdf000066400000000000000000000216461355566575400222600ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGrid6.svg000066400000000000000000001032411355566575400222760ustar00rootroot00000000000000 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.18.2/src/docs/usr-manual/figSStructGridFEM1.pdf000066400000000000000000000326501355566575400226000ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM1.svg000066400000000000000000000766561355566575400226440ustar00rootroot00000000000000 image/svg+xmlpart 1part 2part 3part 4part 5 part 0 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructGridFEM2.pdf000066400000000000000000000276261355566575400226100ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM2.svg000066400000000000000000000210611355566575400226210ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) hypre-2.18.2/src/docs/usr-manual/figSStructGridFEM3.pdf000066400000000000000000000314561355566575400226050ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM3.svg000066400000000000000000000370221355566575400226260ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) hypre-2.18.2/src/docs/usr-manual/figSStructGridFEM4.pdf000066400000000000000000000317731355566575400226100ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM4.svg000066400000000000000000000402511355566575400226250ustar00rootroot00000000000000 image/svg+xmlpart 0 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructGridFEM5.pdf000066400000000000000000000325041355566575400226020ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM5.svg000066400000000000000000000435441355566575400226360ustar00rootroot00000000000000 image/svg+xmlpart 1 part 0 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructGridFEM6.pdf000066400000000000000000000325351355566575400226070ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridFEM6.svg000066400000000000000000000766531355566575400226460ustar00rootroot00000000000000 image/svg+xmlpart 1part 2part 3part 4part 5 part 0 (9,9) (1,1) 0123 hypre-2.18.2/src/docs/usr-manual/figSStructGridVars.pdf000066400000000000000000000103051355566575400230140ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructGridVars.svg000066400000000000000000000342671355566575400230570ustar00rootroot00000000000000 image/svg+xml(i,j) hypre-2.18.2/src/docs/usr-manual/figSStructStenc0.pdf000066400000000000000000000251051355566575400224330ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructStenc0.svg000066400000000000000000000575761355566575400225020ustar00rootroot00000000000000 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.18.2/src/docs/usr-manual/figSStructStenc1.pdf000066400000000000000000000200361355566575400224320ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSStructStenc1.svg000066400000000000000000000426671355566575400224760ustar00rootroot00000000000000 image/svg+xml(-1,1)(-1,0)(0,-1) 0 1 2 3 4 5 6 7 8 hypre-2.18.2/src/docs/usr-manual/figSquareHole.pdf000066400000000000000000000262511355566575400220220ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figSquareHole.svg000066400000000000000000005057011355566575400220520ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/figStructExample1.pdf000066400000000000000000000275471355566575400226440ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructExample1.svg000066400000000000000000003444741355566575400226730ustar00rootroot00000000000000 image/svg+xml(-3,1) (6,4) process 0process 1 hypre-2.18.2/src/docs/usr-manual/figStructGrid1.pdf000066400000000000000000000146111355566575400221220ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructGrid1.svg000066400000000000000000002076561355566575400221650ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.18.2/src/docs/usr-manual/figStructGrid2.pdf000066400000000000000000000110011355566575400221110ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructGrid2.svg000066400000000000000000000420051355566575400221470ustar00rootroot00000000000000 image/svg+xml(-3,1) hypre-2.18.2/src/docs/usr-manual/figStructGrid3.pdf000066400000000000000000000143001355566575400221170ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructGrid3.svg000066400000000000000000001566241355566575400221650ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.18.2/src/docs/usr-manual/figStructGrid4.pdf000066400000000000000000000146141355566575400221300ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructGrid4.svg000066400000000000000000002013771355566575400221620ustar00rootroot00000000000000 image/svg+xml(-3,1) (2,4) hypre-2.18.2/src/docs/usr-manual/figStructGridBoxes.pdf000066400000000000000000000206551355566575400230470ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructGridBoxes.svg000066400000000000000000000650101355566575400230670ustar00rootroot00000000000000 image/svg+xml(-3,2)(6,11)(7,3)(15,8) Index Space hypre-2.18.2/src/docs/usr-manual/figStructStenc0.pdf000066400000000000000000000225221355566575400223100ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc0.svg000066400000000000000000000331641355566575400223420ustar00rootroot00000000000000 image/svg+xml01234 ( 0, 0) (-1, 0) ( 1, 0)( 0,-1)( 0, 1) stencil entries offsets hypre-2.18.2/src/docs/usr-manual/figStructStenc1.pdf000066400000000000000000000077761355566575400223270ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc1.svg000066400000000000000000000222571355566575400223440ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) hypre-2.18.2/src/docs/usr-manual/figStructStenc2.pdf000066400000000000000000000135351355566575400223160ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc2.svg000066400000000000000000000142631355566575400223430ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 hypre-2.18.2/src/docs/usr-manual/figStructStenc3.pdf000066400000000000000000000141471355566575400223170ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc3.svg000066400000000000000000000177271355566575400223540ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 hypre-2.18.2/src/docs/usr-manual/figStructStenc4.pdf000066400000000000000000000145371355566575400223230ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc4.svg000066400000000000000000000233471355566575400223500ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 2 hypre-2.18.2/src/docs/usr-manual/figStructStenc5.pdf000066400000000000000000000152511355566575400223160ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc5.svg000066400000000000000000000270221355566575400223430ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 2 3 hypre-2.18.2/src/docs/usr-manual/figStructStenc6.pdf000066400000000000000000000156271355566575400223260ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc6.svg000066400000000000000000000324541355566575400223510ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 4 2 3 hypre-2.18.2/src/docs/usr-manual/figStructStenc7.pdf000066400000000000000000000155771355566575400223330ustar00rootroot00000000000000%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.18.2/src/docs/usr-manual/figStructStenc7.svg000066400000000000000000000324541355566575400223520ustar00rootroot00000000000000 image/svg+xml(-1,-1)(0,0) 0 1 4 2 3 hypre-2.18.2/src/docs/usr-manual/hypre_wiw.svg000066400000000000000000000674551355566575400213420ustar00rootroot00000000000000 image/svg+xmlhypre-2.18.2/src/docs/usr-manual/index.rst000066400000000000000000000012071355566575400204240ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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. Welcome to hypre's documentation! ================================= .. include:: ../copyright.txt .. toctree:: :maxdepth: 3 ch-intro ch-struct ch-sstruct ch-fei ch-ij ch-solvers ch-misc ch-references hypre-2.18.2/src/docs/usr-manual/solvers-ads.rst000066400000000000000000000313251355566575400215630ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/usr-manual/solvers-ams.rst000066400000000000000000000470341355566575400216000ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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\, \nabla u, \nabla 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.18.2/src/docs/usr-manual/solvers-boomeramg.rst000066400000000000000000000204701355566575400227630ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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. While the default settings work fairly well for two-dimensional diffusion problems, for three-dimensional diffusion problems, it is recommended to choose a lower complexity coarsening like HMIS or PMIS (coarsening 10 or 8) and combine it with a distance-two interpolation (interpolation 6 or 7), that is also truncated to 4 or 5 elements per row. 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, * 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 the user has to set the number of levels to which he wants 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. Note that the default coarsening is HMIS [DeYH2004]_. Interpolation Options ------------------------------------------------------------------------------ Various interpolation techniques can be set using ``HYPRE_BoomerAMGSetInterpType``: * the "classical" interpolation as defined in [RuSt1987]_, * direct interpolation [Stue1999]_, * standard interpolation [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 [DFNY2008]_, * multipass interpolation [Stue1999]_, * two-stage interpolation [Yang2010]_, * Jacobi interpolation [Stue1999]_, * the "classical" interpolation modified for hyperbolic PDEs. Jacobi interpolation is only use 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. 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, * a hybrid Gauss-Seidel / Jacobi relaxation scheme, * a symmetric hybrid Gauss-Seidel / Jacobi relaxation scheme, * l1-Gauss-Seidel or Jacobi, * Chebyshev smoothers, * hybrid block and Schwarz smoothers [Yang2004]_, * ILU and approximate inverse smoothers. 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``. 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. 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 2-dimensional problems and the low complexity coarsening algorithms. For 3-dimensional problems a better choice appears to be 0.5, when using the default coarsening algorithm. However, the choice of the strength threshold is problem dependent and therefore there could be better choices than the two suggested ones. hypre-2.18.2/src/docs/usr-manual/solvers-euclid.rst000066400000000000000000000232621355566575400222620ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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 ============================================================================== 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 unsymmetric. 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 unsymmetric. 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 unsymmetric. NOTE: this option can only be used sequentially! hypre-2.18.2/src/docs/usr-manual/solvers-fac.rst000066400000000000000000000101461355566575400215430ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/usr-manual/solvers-fei.rst000066400000000000000000000163541355566575400215640ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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 ============================================================================== 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.18.2/src/docs/usr-manual/solvers-hybrid.rst000066400000000000000000000035741355566575400223020ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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_StructParCSRHybridSetConvergenceTol``. 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. hypre-2.18.2/src/docs/usr-manual/solvers-lobpcg.rst000066400000000000000000000034341355566575400222620ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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. hypre-2.18.2/src/docs/usr-manual/solvers-maxwell.rst000066400000000000000000000104241355566575400224620ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/usr-manual/solvers-mgr.rst000066400000000000000000000061211355566575400215750ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/usr-manual/solvers-mli.rst000066400000000000000000000032141355566575400215710ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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. hypre-2.18.2/src/docs/usr-manual/solvers-parasails.rst000066400000000000000000000141611355566575400227720ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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 ============================================================================== 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.18.2/src/docs/usr-manual/solvers-pilut.rst000066400000000000000000000045501355566575400221510ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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 ============================================================================== **Note:** this code is no longer supported by the hypre team. We recommend to use Euclid instead, which is more versatile and in general more efficient, especially when used with many processors. 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. hypre-2.18.2/src/docs/usr-manual/solvers-smg-pfmg.rst000066400000000000000000000042231355566575400225260ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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.18.2/src/docs/usr-manual/solvers-split.rst000066400000000000000000000020431355566575400221420ustar00rootroot00000000000000.. Copyright 1998-2019 Lawrence Livermore 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. hypre-2.18.2/src/docs/usr-manual/zREADME000066400000000000000000000021001355566575400176260ustar00rootroot00000000000000 Sphinx links: http://www.sphinx-doc.org/en/stable/ http://www.sphinx-doc.org/en/stable/examples.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.18.2/src/examples/000077500000000000000000000000001355566575400153655ustar00rootroot00000000000000hypre-2.18.2/src/examples/CMakeLists.txt000066400000000000000000000010561355566575400201270ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/Makefile000066400000000000000000000163171355566575400170350ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 = mpifort HYPRE_DIR = ../hypre ######################################################################## # Compiling and linking options ######################################################################## COPTS = -g -Wall CINCLUDES = -I$(HYPRE_DIR)/include CDEFS = -DHAVE_CONFIG_H -DHYPRE_TIMING CFLAGS = $(COPTS) $(CINCLUDES) $(CDEFS) FOPTS = -g FINCLUDES = $(CINCLUDES) FFLAGS = $(FOPTS) $(FINCLUDES) CXXOPTS = $(COPTS) -Wno-deprecated CXXINCLUDES = $(CINCLUDES) -I.. CXXDEFS = $(CDEFS) IFLAGS_BXX = CXXFLAGS = $(CXXOPTS) $(CXXINCLUDES) $(CXXDEFS) $(IFLAGS_BXX) IF90FLAGS = F90FLAGS = $(FFLAGS) $(IF90FLAGS) LINKOPTS = $(COPTS) LIBS = -L$(HYPRE_DIR)/lib -lHYPRE -lm LFLAGS = $(LINKOPTS) $(LIBS) -lstdc++ 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 .cxx .f90 .c.o: $(CC) $(CFLAGS) -c $< .f.o: $(F77) $(FFLAGS) -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 bigint: $(BIGINTPROGS) fortran: $(FORTRANPROGS) maxdim: $(MAXDIMPROGS) complex: $(COMPLEXPROGS) ######################################################################## # Example 1 ######################################################################## ex1: ex1.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 2 ######################################################################## ex2: ex2.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 3 ######################################################################## ex3: ex3.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 4 ######################################################################## ex4: ex4.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 ######################################################################## ex5: ex5.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 with 64-bit integers ######################################################################## ex5big: ex5big.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 5 Fortran 77 ######################################################################## ex5f: ex5f.o $(F77) -o $@ $^ $(LFLAGS77) ######################################################################## # Example 6 ######################################################################## ex6: ex6.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 7 ######################################################################## ex7: ex7.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 8 ######################################################################## ex8: ex8.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 9 ######################################################################## ex9: ex9.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 10 ######################################################################## ex10: ex10.o $(CXX) -o $@ $^ $(LFLAGS) ######################################################################## # Example 11 ######################################################################## ex11: ex11.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 12 ######################################################################## ex12: ex12.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 12 Fortran 77 ######################################################################## ex12f: ex12f.o $(F77) -o $@ $^ $(LFLAGS77) ######################################################################## # Example 13 ######################################################################## ex13: ex13.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 14 ######################################################################## ex14: ex14.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 15 ######################################################################## ex15: ex15.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 15 with 64-bit integers ######################################################################## ex15big: ex15big.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 16 ######################################################################## ex16: ex16.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 17 ######################################################################## ex17: ex17.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 18 ######################################################################## ex18: ex18.o $(CC) -o $@ $^ $(LFLAGS) ######################################################################## # Example 18 (complex) ######################################################################## ex18comp: ex18comp.o $(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) 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.18.2/src/examples/docs/000077500000000000000000000000001355566575400163155ustar00rootroot00000000000000hypre-2.18.2/src/examples/docs/2d-bi.htm000066400000000000000000000004341355566575400177250ustar00rootroot00000000000000Example Codes

2D Biharmonic Equation Example Codes

hypre-2.18.2/src/examples/docs/2d-con-reac-diff.htm000066400000000000000000000005101355566575400217230ustar00rootroot00000000000000Example Codes

2D Convection-Reaction-Diffusion Example Codes

hypre-2.18.2/src/examples/docs/2d-laplace-eig.htm000066400000000000000000000004361355566575400215000ustar00rootroot00000000000000Example Codes

2D Laplace Eigenproblem Example Codes

hypre-2.18.2/src/examples/docs/2d-laplace.htm000066400000000000000000000010451355566575400207330ustar00rootroot00000000000000Example Codes

2D Laplace Example Codes

hypre-2.18.2/src/examples/docs/3d-maxwell.htm000066400000000000000000000004321355566575400210030ustar00rootroot00000000000000Example Codes

3D Definite Maxwell Example Codes

hypre-2.18.2/src/examples/docs/5pt.htm000066400000000000000000000010461355566575400175400ustar00rootroot00000000000000Example Codes

5-Point Stencil Example Codes

hypre-2.18.2/src/examples/docs/9pt.htm000066400000000000000000000004251355566575400175440ustar00rootroot00000000000000Example Codes

9-Point Stencil Example Codes

hypre-2.18.2/src/examples/docs/Makefile000066400000000000000000000004771355566575400177650ustar00rootroot00000000000000######################################################################## # 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.18.2/src/examples/docs/README000066400000000000000000000032421355566575400171760ustar00rootroot000000000000001. 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.18.2/src/examples/docs/amg.htm000066400000000000000000000006751355566575400176030ustar00rootroot00000000000000Example Codes

BoomerAMG Example Codes

hypre-2.18.2/src/examples/docs/build_doc.sh000077500000000000000000000020121355566575400205730ustar00rootroot00000000000000#!/bin/sh 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.18.2/src/examples/docs/c++.htm000066400000000000000000000004121355566575400173740ustar00rootroot00000000000000Example Codes

C++ Example Codes

hypre-2.18.2/src/examples/docs/c.htm000066400000000000000000000013061355566575400172510ustar00rootroot00000000000000Example Codes

C Example Codes

hypre-2.18.2/src/examples/docs/code2html.perl000077500000000000000000005766211355566575400211060ustar00rootroot00000000000000#!/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.18.2/src/examples/docs/ex1.htm000066400000000000000000000010331355566575400175210ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex10.htm000066400000000000000000000010771355566575400176110ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex11.htm000066400000000000000000000005621355566575400176100ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex12.htm000066400000000000000000000010511355566575400176030ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex12f.htm000066400000000000000000000010571355566575400177570ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex13.htm000066400000000000000000000033401355566575400176070ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex14.htm000066400000000000000000000005131355566575400176070ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex15.htm000066400000000000000000000023141355566575400176110ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex15big.htm000066400000000000000000000012761355566575400203010ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex16.htm000066400000000000000000000006271355566575400176170ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex2.htm000066400000000000000000000007031355566575400175250ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex3.htm000066400000000000000000000022761355566575400175350ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex4.htm000066400000000000000000000030441355566575400175300ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex5.htm000066400000000000000000000006541355566575400175350ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex5big.htm000066400000000000000000000012701355566575400202120ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex5f.htm000066400000000000000000000006271355566575400177030ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex6.htm000066400000000000000000000010531355566575400175300ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex7.htm000066400000000000000000000026751355566575400175440ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex8.htm000066400000000000000000000010111355566575400175240ustar00rootroot00000000000000

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.18.2/src/examples/docs/ex9.htm000066400000000000000000000020121355566575400175270ustar00rootroot00000000000000

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.18.2/src/examples/docs/fe.htm000066400000000000000000000006421355566575400174230ustar00rootroot00000000000000Example Codes

Finite Elements Example Codes

hypre-2.18.2/src/examples/docs/fei.htm000066400000000000000000000004121355566575400175670ustar00rootroot00000000000000Example Codes

FEI Example Codes

hypre-2.18.2/src/examples/docs/flexgmres-amg.htm000066400000000000000000000004311355566575400215630ustar00rootroot00000000000000Example Codes

Flexible GMRES-AMG Example Codes

hypre-2.18.2/src/examples/docs/fortran.htm000066400000000000000000000004621355566575400205040ustar00rootroot00000000000000Example Codes

Fortran Example Codes

hypre-2.18.2/src/examples/docs/gmres-amg.htm000066400000000000000000000004621355566575400207100ustar00rootroot00000000000000Example Codes

GMRES-AMG Example Codes

hypre-2.18.2/src/examples/docs/gmres-euclid.htm000066400000000000000000000004231355566575400214060ustar00rootroot00000000000000Example Codes

GMRES-Euclid Example Codes

hypre-2.18.2/src/examples/docs/gmres-parasails.htm000066400000000000000000000004261355566575400221230ustar00rootroot00000000000000Example Codes

GMRES-ParaSails Example Codes

hypre-2.18.2/src/examples/docs/gmres-pfmg.htm000066400000000000000000000004621355566575400210750ustar00rootroot00000000000000Example Codes

GMRES-PFMG Example Codes

hypre-2.18.2/src/examples/docs/gmres-smg.htm000066400000000000000000000004611355566575400207310ustar00rootroot00000000000000Example Codes

GMRES-SMG Example Codes

hypre-2.18.2/src/examples/docs/gmres-syspfmg.htm000066400000000000000000000004231355566575400216310ustar00rootroot00000000000000Example Codes

GMRES-SysPFMG Example Codes

hypre-2.18.2/src/examples/docs/hypre_wiw.gif000066400000000000000000000235121355566575400210240ustar00rootroot00000000000000GIF89ahª÷ÿÿÿ÷÷÷ïïïçççÞÞÞÖÖÖÎÎÎÆÆÆµµµ­­­¥¥¥œœœ”””ŒŒŒ„„„{{{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.18.2/src/examples/docs/ij.htm000066400000000000000000000004221355566575400174270ustar00rootroot00000000000000Example Codes

IJ Interface Example Codes

hypre-2.18.2/src/examples/docs/index.htm000066400000000000000000000134311355566575400201400ustar00rootroot00000000000000Example 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.18.2/src/examples/docs/lobpcg-amg.htm000066400000000000000000000004211355566575400210340ustar00rootroot00000000000000Example Codes

LOBPGC-AMG Example Codes

hypre-2.18.2/src/examples/docs/pcg-amg.htm000066400000000000000000000005231355566575400203420ustar00rootroot00000000000000Example Codes

PCG-AMG Example Codes

hypre-2.18.2/src/examples/docs/pcg-ams.htm000066400000000000000000000004161355566575400203570ustar00rootroot00000000000000Example Codes

PCG-AMS Example Codes

hypre-2.18.2/src/examples/docs/pcg-euclid.htm000066400000000000000000000004211355566575400210400ustar00rootroot00000000000000Example Codes

PCG-Euclid Example Codes

hypre-2.18.2/src/examples/docs/pcg-parasails.htm000066400000000000000000000004661355566575400215630ustar00rootroot00000000000000Example Codes

PCG-ParaSails Example Codes

hypre-2.18.2/src/examples/docs/pcg-pfmg.htm000066400000000000000000000005231355566575400205270ustar00rootroot00000000000000Example Codes

PCG-PFMG Example Codes

hypre-2.18.2/src/examples/docs/pcg-smg.htm000066400000000000000000000006241355566575400203660ustar00rootroot00000000000000Example Codes

PCG-SMG Example Codes

hypre-2.18.2/src/examples/docs/pcg-split-smg.htm000066400000000000000000000004231355566575400215140ustar00rootroot00000000000000Example Codes

PCG-split-SMG Example Codes

hypre-2.18.2/src/examples/docs/pcg.htm000066400000000000000000000005561355566575400176060ustar00rootroot00000000000000Example Codes

CG Example Codes

hypre-2.18.2/src/examples/docs/pfmg.htm000066400000000000000000000005171355566575400177630ustar00rootroot00000000000000Example Codes

PFMG Example Codes

hypre-2.18.2/src/examples/docs/replace-ssi.perl000077500000000000000000000007731355566575400214220ustar00rootroot00000000000000#!/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.18.2/src/examples/docs/smg.htm000066400000000000000000000005151355566575400176160ustar00rootroot00000000000000Example Codes

SMG Example Codes

hypre-2.18.2/src/examples/docs/sstruct.htm000066400000000000000000000010541355566575400205360ustar00rootroot00000000000000Example Codes

SStruct Interface Example Codes

hypre-2.18.2/src/examples/docs/struct.htm000066400000000000000000000005741355566575400203610ustar00rootroot00000000000000Example Codes

Struct Interface Example Codes

hypre-2.18.2/src/examples/docs/syspfmg.htm000066400000000000000000000004151355566575400205170ustar00rootroot00000000000000Example Codes

SysPFMG Example Codes

hypre-2.18.2/src/examples/ex1.c000066400000000000000000000254741355566575400162420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /* Struct linear solvers header */ #include "HYPRE_struct_ls.h" #include "vis.c" 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); } /* 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]; /* 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); } 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]; 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); } /* Set the coefficients reaching outside of the boundary to 0 */ if (myid == 0) { double values[3]; 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); } } else if (myid == 1) { double values[4]; 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); } } /* 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]; /* 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); } else if (myid == 1) { int ilower[2]={0,1}, iupper[2]={2,4}; double values[12]; /* 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); } /* 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) { GLVis_PrintStructGrid(grid, "vis/ex1.mesh", myid, NULL, NULL); GLVis_PrintStructVector(x, "vis/ex1.sol", myid); GLVis_PrintData("vis/ex1.data", myid, num_procs); } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex10.cxx000066400000000000000000000412771355566575400167010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" 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); // 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 MPI MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex11.c000066400000000000000000000241451355566575400163150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" /* lobpcg stuff */ #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "temp_multivector.h" #include "_hypre_parcsr_mv.h" #include "vis.c" 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_ParVector* pvx; HYPRE_Solver precond, lobpcg_solver; mv_InterfaceInterpreter* interpreter; 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); /* 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 += 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) */ 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]; 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); /* 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 */ { int time_index; 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 */ mv_MultiVectorPtr eigenvectors = NULL; mv_MultiVectorPtr constraints = NULL; double *eigenvalues = NULL; if (myid != 0) verbosity = 0; /* define an interpreter for the ParCSR interface */ interpreter = hypre_CTAlloc(mv_InterfaceInterpreter, 1, HYPRE_MEMORY_HOST); HYPRE_ParCSRSetupInterpreter(interpreter); HYPRE_ParCSRSetupMatvec(&matvec_fn); /* eigenvectors - create a multivector */ eigenvectors = mv_MultiVectorCreateFromSampleVector(interpreter, blockSize, par_x); mv_MultiVectorSetRandom (eigenvectors, lobpcgSeed); /* eigenvectors - get a pointer */ { mv_TempMultiVector* tmp = (mv_TempMultiVector*) mv_MultiVectorGetData(eigenvectors); pvx = (HYPRE_ParVector*)(tmp -> vector); } /* 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); 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", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* clean-up */ HYPRE_BoomerAMGDestroy(precond); HYPRE_LOBPCGDestroy(lobpcg_solver); hypre_TFree(eigenvalues, HYPRE_MEMORY_HOST); hypre_TFree(interpreter, HYPRE_MEMORY_HOST); } /* Save the solution for GLVis visualization, see vis/glvis-ex11.sh */ if (vis) { FILE *file; char filename[255]; int nvalues = local_size; double *values; /* 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); } /* Clean up */ HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); /* Finalize MPI*/ MPI_Finalize(); return(0); } hypre-2.18.2/src/examples/ex12.c000066400000000000000000000416651355566575400163240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "vis.c" 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); 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]; 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); } 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]; 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); } /* 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]; 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); } } else if (myid == 1) { double values[5]; 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); } } /* 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]; /* 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); } else if (myid == 1) { int ilower[2]={0,1}, iupper[2]={2,4}; double values[20]; /* 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); } /* 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) { /* 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); } /* Free memory */ HYPRE_SStructGridDestroy(grid); HYPRE_SStructStencilDestroy(stencil); HYPRE_SStructGraphDestroy(graph); HYPRE_SStructMatrixDestroy(A); HYPRE_SStructVectorDestroy(b); HYPRE_SStructVectorDestroy(x); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex12f.f000066400000000000000000000404031355566575400164620ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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 values(100), tol ! 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) 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) ! Finalize MPI call MPI_Finalize(ierr) stop end hypre-2.18.2/src/examples/ex13.c000066400000000000000000000613171355566575400163210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #ifndef M_PI #define M_PI 3.14159265358979 #endif #include "vis.c" /* 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[4][4], 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); /* 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 S[4][4], F[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]); } } } } /* 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) { 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); } 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 MPI */ MPI_Finalize(); return 0; } hypre-2.18.2/src/examples/ex14.c000066400000000000000000000542451355566575400163240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #ifndef M_PI #define M_PI 3.14159265358979 #endif #include "vis.c" /* 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[4][4], 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); /* 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 */ double S[4][4], F[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); } } } } /* 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) { 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); } 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 MPI */ MPI_Finalize(); return 0; } hypre-2.18.2/src/examples/ex15.c000066400000000000000000001155271355566575400163260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "_hypre_parcsr_ls.h" #include "HYPRE.h" #include "vis.c" 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 hypre_Rand(); 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 hypre_Rand(); 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; 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 ; int time_index; 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); /* 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 */ time_index = hypre_InitializeTiming("SStruct Setup"); hypre_BeginTiming(time_index); /* 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] */ /* [7]------[6] */ 0, 0, +1, -1, /* x-edge [3]-[2] */ /* /| /| */ 1, -1, 0, -1, /* y-edge [0]-[3] */ /* / | / | */ 0, 0, -1, +1, /* x-edge [4]-[5] */ /* [4]------[5] | */ 1, +1, 0, +1, /* y-edge [5]-[6] */ /* | [3]----|-[2] */ 0, 0, +1, +1, /* x-edge [7]-[6] */ /* | / | / */ 1, -1, 0, +1, /* y-edge [4]-[7] */ /* |/ |/ */ 2, -1, -1, 0, /* z-edge [0]-[4] */ /* [0]------[1] */ 2, +1, -1, 0, /* z-edge [1]-[5] */ 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 */ double S[12][12], F[12]; int i, j, k; 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. */ { 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 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 */ { 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("SStruct phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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) printf("Problem size: %d\n\n", hypre_ParCSRMatrixGlobalNumRows((hypre_ParCSRMatrix*)par_A)); /* Start timing */ time_index = hypre_InitializeTiming("AMS Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("AMS Solve"); hypre_BeginTiming(time_index); /* Call the solve */ HYPRE_ParCSRPCGSolve(solver, par_A, par_b, par_x); /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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) { 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); } 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 MPI */ MPI_Finalize(); return 0; } hypre-2.18.2/src/examples/ex15big.c000066400000000000000000001050351355566575400170010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "_hypre_parcsr_ls.h" #include "HYPRE.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 hypre_Rand(); 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 hypre_Rand(); 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 ; HYPRE_Int time_index; 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); /* 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 */ time_index = hypre_InitializeTiming("SStruct Setup"); hypre_BeginTiming(time_index); /* 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] */ /* [7]------[6] */ 0, 0, +1, -1, /* x-edge [3]-[2] */ /* /| /| */ 1, -1, 0, -1, /* y-edge [0]-[3] */ /* / | / | */ 0, 0, -1, +1, /* x-edge [4]-[5] */ /* [4]------[5] | */ 1, +1, 0, +1, /* y-edge [5]-[6] */ /* | [3]----|-[2] */ 0, 0, +1, +1, /* x-edge [7]-[6] */ /* | / | / */ 1, -1, 0, +1, /* y-edge [4]-[7] */ /* |/ |/ */ 2, -1, -1, 0, /* z-edge [0]-[4] */ /* [0]------[1] */ 2, +1, -1, 0, /* z-edge [1]-[5] */ 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("SStruct phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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) printf("Problem size: %lld\n\n", hypre_ParCSRMatrixGlobalNumRows((hypre_ParCSRMatrix*)par_A)); /* Start timing */ time_index = hypre_InitializeTiming("AMS Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("AMS Solve"); hypre_BeginTiming(time_index); /* Call the solve */ HYPRE_ParCSRPCGSolve(solver, par_A, par_b, par_x); /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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 MPI */ MPI_Finalize(); return 0; } hypre-2.18.2/src/examples/ex16.c000066400000000000000000000465351355566575400163310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_mv.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE.h" #include "vis.c" /* 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); /* 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) { 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); } 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 MPI */ MPI_Finalize(); return 0; } hypre-2.18.2/src/examples/ex17.c000066400000000000000000000222601355566575400163170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_struct_ls.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); /* 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex18.c000066400000000000000000000314101355566575400163150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #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); /* 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex18comp.c000066400000000000000000000322531355566575400172020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #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); /* 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex2.c000066400000000000000000000336341355566575400162400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /* Struct linear solvers header */ #include "HYPRE_struct_ls.h" #include "vis.c" 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); } /* 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* For each box, set any coefficients that reach outside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 6; double values[6]; 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); } } else if (myid == 1) { int maxnvalues = 4; double values[4]; 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); } } /* 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* 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) { GLVis_PrintStructGrid(grid, "vis/ex2.mesh", myid, NULL, NULL); GLVis_PrintStructVector(x, "vis/ex2.sol", myid); GLVis_PrintData("vis/ex2.data", myid, num_procs); } /* Free memory */ HYPRE_StructGridDestroy(grid); HYPRE_StructStencilDestroy(stencil); HYPRE_StructMatrixDestroy(A); HYPRE_StructVectorDestroy(b); HYPRE_StructVectorDestroy(x); HYPRE_StructPCGDestroy(solver); HYPRE_StructSMGDestroy(precond); /* Finalize MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex3.c000066400000000000000000000332231355566575400162330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #include "vis.c" 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; 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); } } /* 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) { 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/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); } 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex4.c000066400000000000000000001100031355566575400162240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_krylov.h" #include "HYPRE_struct_ls.h" #ifdef M_PI #define PI M_PI #else #define PI 3.14159265358979 #endif #include "vis.c" /* 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; int time_index; 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); /* 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 */ time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("SMG Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_StructSMGSolve(solver, A, b, x); /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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 */ time_index = hypre_InitializeTiming("PFMG Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("PFMG Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_StructPFMGSolve(solver, A, b, x); /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); 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 ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); /* PCG Solve */ HYPRE_StructPCGSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); 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 ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); /* GMRES Solve */ HYPRE_StructGMRESSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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) { 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); } 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex5.c000066400000000000000000000471101355566575400162350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" #include "vis.c" int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm); 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); /* 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 += 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) */ 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]; 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; 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, 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) { 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); } /* Clean up */ HYPRE_IJMatrixDestroy(A); HYPRE_IJVectorDestroy(b); HYPRE_IJVectorDestroy(x); /* 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.18.2/src/examples/ex5big.c000066400000000000000000000453661355566575400167320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_krylov.h" #include "HYPRE.h" #include "HYPRE_parcsr_ls.h" int hypre_FlexGMRESModifyPCAMGExample(void *precond_data, int iterations, double rel_residual_norm); 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); /* 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 += 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) */ 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, 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 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.18.2/src/examples/ex5f.f000066400000000000000000000343271355566575400164140ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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' integer MAX_LOCAL_SIZE integer HYPRE_PARCSR parameter (MAX_LOCAL_SIZE=123000) ! the following is from HYPRE.c parameter (HYPRE_PARCSR=5555) 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) 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 ! 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 call HYPRE_IJMatrixSetValues( 1 A, 1, nnz-1, i, 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) ! 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) ! Finalize MPI call MPI_Finalize(ierr) stop end hypre-2.18.2/src/examples/ex6.c000066400000000000000000000445401355566575400162420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "vis.c" 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); 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* For each box, set any coefficients that reach ouside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 6; double values[6]; 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); } } else if (myid == 1) { int maxnvalues = 4; double values[4]; 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); } } /* 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* 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) { 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); } /* 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex7.c000066400000000000000000001206771355566575400162510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_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 #include "vis.c" /* 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; int time_index; 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); /* 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 */ time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("SMG Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_StructSMGSolve(solver, sA, sb, sx); hypre_EndTiming(time_index); /* Finalize current timing */ hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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 */ time_index = hypre_InitializeTiming("PFMG Setup"); hypre_BeginTiming(time_index); /* 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 */ hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* Start timing again */ time_index = hypre_InitializeTiming("PFMG Solve"); hypre_BeginTiming(time_index); /* Solve */ HYPRE_StructPFMGSolve(solver, sA, sb, sx); /* Finalize current timing */ hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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)) { time_index = hypre_InitializeTiming("PCG Setup"); hypre_BeginTiming(time_index); 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 ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("PCG Solve"); hypre_BeginTiming(time_index); /* PCG Solve */ HYPRE_StructPCGSolve(solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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)) { time_index = hypre_InitializeTiming("GMRES Setup"); hypre_BeginTiming(time_index); 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 ); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); time_index = hypre_InitializeTiming("GMRES Solve"); hypre_BeginTiming(time_index); /* GMRES Solve */ HYPRE_StructGMRESSolve(solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* 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) { 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); } 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex8.c000066400000000000000000000613251355566575400162440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /* SStruct linear solvers headers */ #include "HYPRE_sstruct_ls.h" #include "vis.c" 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); 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* 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]; 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); } } /* For each box, set any coefficients that reach ouside of the boundary to 0 */ if (myid == 0) { int maxnvalues = 9; double values[9]; 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); } } else if (myid == 1) { int maxnvalues = 4; double values[4]; 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); } } /* 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]; 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); } /* 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]; 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); } } 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]; 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); } } /* 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) { 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); } /* 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/ex9.c000066400000000000000000000622141355566575400162430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "_hypre_utilities.h" #include "HYPRE_sstruct_ls.h" #include "HYPRE_krylov.h" #include "vis.c" 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); /* 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_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) { 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); } 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 MPI */ MPI_Finalize(); return (0); } hypre-2.18.2/src/examples/vis.c000066400000000000000000000677751355566575400163600ustar00rootroot00000000000000/* Save a structured n x n mesh of square elements on the unit square into a GLVis mesh file with the given name. */ 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.18.2/src/examples/vis/000077500000000000000000000000001355566575400161665ustar00rootroot00000000000000hypre-2.18.2/src/examples/vis/Makefile000066400000000000000000000003501355566575400176240ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/README000066400000000000000000000063171355566575400170550ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex1.sh000077500000000000000000000010701355566575400203420ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex10.sh000077500000000000000000000010721355566575400204240ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex11.sh000077500000000000000000000013021355566575400204210ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex12.sh000077500000000000000000000010711355566575400204250ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex13.sh000077500000000000000000000011061355566575400204250ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex14.sh000077500000000000000000000011061355566575400204260ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex15.sh000077500000000000000000000010771355566575400204360ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex16.sh000077500000000000000000000010761355566575400204360ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex2.sh000077500000000000000000000010701355566575400203430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex3.sh000077500000000000000000000013351355566575400203500ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex4.sh000077500000000000000000000013351355566575400203510ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex5.sh000077500000000000000000000013011355566575400203430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex6.sh000077500000000000000000000010701355566575400203470ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex7.sh000077500000000000000000000013351355566575400203540ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex8.sh000077500000000000000000000010701355566575400203510ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/examples/vis/glvis-ex9.sh000077500000000000000000000020551355566575400203560ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/000077500000000000000000000000001355566575400150755ustar00rootroot00000000000000hypre-2.18.2/src/krylov/CMakeLists.txt000066400000000000000000000013231355566575400176340ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/krylov/HYPRE_MatvecFunctions.h000066400000000000000000000017531355566575400213330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_bicgstab.c000066400000000000000000000170011355566575400177650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( (void *) solver, (void *) A, (void *) b, (void *) x ) ); } /*-------------------------------------------------------------------------- * HYPRE_BiCGSTABSolve *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BiCGSTABSolve( HYPRE_Solver solver, HYPRE_Matrix A, HYPRE_Vector b, HYPRE_Vector x ) { return( hypre_BiCGSTABSolve( (void *) solver, (void *) A, (void *) b, (void *) 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.18.2/src/krylov/HYPRE_cgnr.c000066400000000000000000000133311355566575400171420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_cogmres.c000066400000000000000000000251401355566575400176510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_flexgmres.c000066400000000000000000000232611355566575400202100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_gmres.c000066400000000000000000000253741355566575400173400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_krylov.h000066400000000000000000001025201355566575400175430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name 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. * * @memo A basic interface for Krylov solvers **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Krylov Solvers **/ /*@{*/ #ifndef HYPRE_SOLVER_STRUCT #define HYPRE_SOLVER_STRUCT struct hypre_Solver_struct; /** * The solver object. **/ typedef struct hypre_Solver_struct *HYPRE_Solver; #endif #ifndef HYPRE_MATRIX_STRUCT #define HYPRE_MATRIX_STRUCT struct hypre_Matrix_struct; /** * The matrix object. **/ typedef struct hypre_Matrix_struct *HYPRE_Matrix; #endif #ifndef HYPRE_VECTOR_STRUCT #define HYPRE_VECTOR_STRUCT struct hypre_Vector_struct; /** * The vector object. **/ typedef struct hypre_Vector_struct *HYPRE_Vector; #endif typedef HYPRE_Int (*HYPRE_PtrToSolverFcn)(HYPRE_Solver, HYPRE_Matrix, HYPRE_Vector, HYPRE_Vector); #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 {\tt b} and {\tt 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 {\it only}, then set the relative convergence * tolerance to 0.0. (The default convergence test is $ \leq$ * max(relative$\_$tolerance$^{2} \ast $, absolute$\_$tolerance$^2$).) **/ HYPRE_Int HYPRE_PCGSetAbsoluteTol(HYPRE_Solver solver, HYPRE_Real a_tol); /** * (Optional) Set a residual-based convergence tolerance which checks if * $\|r_{old}-r_{new}\| < rtol \|b\|$. 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) 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 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_GMRESGetSkipRealResidualCheck(HYPRE_Solver solver, HYPRE_Int *skip_real_r_check); /** **/ 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 {\tt b} and {\tt 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 {\it only}, then * set the relative convergence tolerance to 0.0. (The convergence test is * $\|r\| \leq$ max(relative$\_$tolerance$\ast \|b\|$, absolute$\_$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_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 {\tt b} and {\tt 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 {\it only}, then * set the relative convergence tolerance to 0.0. (The convergence test is * $\|r\| \leq$ max(relative$\_$tolerance$\ast \|b\|$, absolute$\_$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 {\tt b} and {\tt 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 {\it only}, then * set the relative convergence tolerance to 0.0. (The convergence test is * $\|r\| \leq$ max(relative$\_$tolerance$\ast \|b\|$, absolute$\_$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 {\tt b} and {\tt 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 {\it only}, then * set the relative convergence tolerance to 0.0. (The convergence test is * $\|r\| \leq$ max(relative$\_$tolerance$\ast \|b\|$, absolute$\_$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 {\tt b} and {\tt 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 {\it only}, then * set the relative convergence tolerance to 0.0. (The convergence test is * $\|r\| \leq$ max(relative$\_$tolerance $\ast \|b\|$, absolute$\_$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 {\tt b} and {\tt 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.18.2/src/krylov/HYPRE_lgmres.c000066400000000000000000000230701355566575400175030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_lobpcg.c000066400000000000000000000422651355566575400174670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/HYPRE_lobpcg.h000066400000000000000000000132131355566575400174630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "HYPRE_MatvecFunctions.h" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Eigensolvers * * These eigensolvers support many of the matrix/vector storage schemes in * hypre. They should be used in conjunction with the storage-specific * interfaces. * * @memo A basic interface for eigensolvers **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name EigenSolvers **/ /*@{*/ #ifndef HYPRE_SOLVER_STRUCT #define HYPRE_SOLVER_STRUCT struct hypre_Solver_struct; /** * The solver object. **/ typedef struct hypre_Solver_struct *HYPRE_Solver; #endif #ifndef HYPRE_MATRIX_STRUCT #define HYPRE_MATRIX_STRUCT struct hypre_Matrix_struct; /** * The matrix object. **/ typedef struct hypre_Matrix_struct *HYPRE_Matrix; #endif #ifndef HYPRE_VECTOR_STRUCT #define HYPRE_VECTOR_STRUCT struct hypre_Vector_struct; /** * The vector object. **/ typedef struct hypre_Vector_struct *HYPRE_Vector; #endif /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt 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 {\tt 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: {\tt 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.18.2/src/krylov/HYPRE_pcg.c000066400000000000000000000276611355566575400167750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( (void *) solver, (void *) A, (void *) b, (void *) 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_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_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.18.2/src/krylov/Makefile000066400000000000000000000037421355566575400165430ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/krylov/bicgstab.c000066400000000000000000000641241355566575400170260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; 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; return (void *) bicgstab_data; } /*-------------------------------------------------------------------------- * hypre_BiCGSTABDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BiCGSTABDestroy( void *bicgstab_vdata ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; 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); } 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); (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"; } 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; (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 = sqrt((*(bicgstab_functions->InnerProd))(b,b)); /* Since it is 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); return hypre_error_flag; } res = (*(bicgstab_functions->InnerProd))(r0,r0); r_norm = sqrt(res); r_norm_0 = r_norm; /* Since it is 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); 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) { 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; 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 (fabs(temp) >= epsmac) alpha = res/temp; else { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"BiCGSTAB broke down!! divide by near zero\n"); 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 = 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 = 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 = pow( r_norm / r_norm_0, 1.0/(2.0*iter)); weight = fabs(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 (fabs(res) >= epsmac) beta = 1.0/res; else { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"BiCGSTAB broke down!! res=0 \n"); return hypre_error_flag; } res = (*(bicgstab_functions->InnerProd))(r0,r); beta *= res; (*(bicgstab_functions->Axpy))(-gamma,q,p); if (fabs(gamma) >= epsmac) (*(bicgstab_functions->ScaleVector))((beta*alpha/gamma),p); else { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"BiCGSTAB broke down!! gamma=0 \n"); 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); 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.18.2/src/krylov/bicgstab.h000066400000000000000000000133341355566575400170300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/cgnr.c000066400000000000000000000474061355566575400162050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 = Precond; return cgnr_functions; } /*-------------------------------------------------------------------------- * hypre_CGNRCreate *--------------------------------------------------------------------------*/ void * hypre_CGNRCreate( hypre_CGNRFunctions *cgnr_functions ) { hypre_CGNRData *cgnr_data; 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; 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; 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); } 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; (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"; } 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; */ /*----------------------------------------------------------------------- * 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 is 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; 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; 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] = sqrt((*(cgnr_functions->InnerProd))(r,r)); /* Since it is 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; 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 is 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; 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] = 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 = 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; 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.18.2/src/krylov/cgnr.h000066400000000000000000000114351355566575400162030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/cogmres.c000066400000000000000000001245571355566575400167160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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; 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; return (void *) cogmres_data; } /*-------------------------------------------------------------------------- * hypre_COGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESDestroy( void *cogmres_vdata ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; HYPRE_Int i; 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 ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_COGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_COGMRESGetResidual( void *cogmres_vdata, void **residual ) { /* returns a pointer to the residual vector */ 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); (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"; } 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, *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; (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 = sqrt((*(cogmres_functions->InnerProd))(b,b)); real_r_norm_old = b_norm; /* Since it is 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); return hypre_error_flag; } r_norm = sqrt((*(cogmres_functions->InnerProd))(p[0],p[0])); r_norm_0 = r_norm; /* Since it is 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); 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); 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 = 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 1) { (*(cogmres_functions->MassDotpTwo))((void *) p[i], p[i-1], p, i, unroll, &hh[itmp], &uu[itmp]); for (j=0; jMassInnerProd))((void *) p[i], p, i, unroll, &hh[itmp]); for (j=0; jMassAxpy))(&hh[itmp],p,p[i], i, unroll); for (j=0; jInnerProd))(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 = 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 = fabs(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 = pow( r_norm / r_norm_0, 1.0/(2.0*iter)); weight = fabs(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= 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 = 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 = 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 = 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 = 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 = 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); 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.18.2/src/krylov/cogmres.h000066400000000000000000000130601355566575400167050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/flexgmres.c000066400000000000000000001047361355566575400172500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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; 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; return (void *) fgmres_data; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESDestroy( void *fgmres_vdata ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; HYPRE_Int i; 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 ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_FlexGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_FlexGMRESGetResidual( void *fgmres_vdata, void **residual ) { /* returns a pointer to the residual vector */ 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); (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*)"gmres.out.log"; } 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... */ (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 = sqrt((*(fgmres_functions->InnerProd))(b,b)); /* Since it is 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); return hypre_error_flag; } r_norm = sqrt((*(fgmres_functions->InnerProd))(p[0],p[0])); r_norm_0 = r_norm; /* Since it is 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); 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); 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 = 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 = 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 = 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 = fabs(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 = pow( r_norm / r_norm_0, 1.0/(2.0*iter)); weight = fabs(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 = 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); 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 *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm)) { 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) { /* Here would could check the number of its and the current residual and make some changes to the preconditioner. There is an example in ex5.c.*/ return 0; } hypre-2.18.2/src/krylov/flexgmres.h000066400000000000000000000116621355566575400172500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/gmres.c000066400000000000000000001226271355566575400163700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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; 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; return (void *) gmres_data; } /*-------------------------------------------------------------------------- * hypre_GMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESDestroy( void *gmres_vdata ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; HYPRE_Int i; 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 ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_GMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_GMRESGetResidual( void *gmres_vdata, void **residual ) { /* returns a pointer to the residual vector */ 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); HYPRE_Int (*precond_setup)(void*,void*,void*,void*) = (gmres_functions->precond_setup); void *precond_data = (gmres_data -> precond_data); HYPRE_Int rel_change = (gmres_data -> rel_change); (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"; } } 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; 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; (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 = sqrt((*(gmres_functions->InnerProd))(b,b)); real_r_norm_old = b_norm; /* Since it is 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); return hypre_error_flag; } r_norm = sqrt((*(gmres_functions->InnerProd))(p[0],p[0])); r_norm_0 = r_norm; /* Since it is 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); 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); 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 = 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 = 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 = 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 = fabs(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 = pow( r_norm / r_norm_0, 1.0/(2.0*iter)); weight = fabs(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= 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 = 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 = 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 = 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 = 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 = 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); 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.18.2/src/krylov/gmres.h000066400000000000000000000114731355566575400163710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/headers000077500000000000000000000043421355566575400164410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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=krylov.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ #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) \ ( (type *)(*(funcs->CAlloc))\ ((size_t)(count), (size_t)sizeof(type)) ) #define hypre_TFreeF( ptr, funcs ) \ ( (*(funcs->Free))((char *)ptr), ptr = NULL ) #ifdef __cplusplus extern "C" { #endif @ #=========================================================================== # Structures and prototypes #=========================================================================== cat bicgstab.h >> $INTERNAL_HEADER cat cgnr.h >> $INTERNAL_HEADER cat gmres.h >> $INTERNAL_HEADER cat lgmres.h >> $INTERNAL_HEADER cat flexgmres.h >> $INTERNAL_HEADER cat pcg.h >> $INTERNAL_HEADER ../utilities/protos bicgstab.c >> $INTERNAL_HEADER ../utilities/protos cgnr.c >> $INTERNAL_HEADER ../utilities/protos gmres.c >> $INTERNAL_HEADER ../utilities/protos flexgmres.c >> $INTERNAL_HEADER ../utilities/protos lgmres.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_bicgstab.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_cgnr.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_gmres.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_flexgmres.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_lgmres.c >> $INTERNAL_HEADER ../utilities/protos HYPRE_pcg.c >> $INTERNAL_HEADER ../utilities/protos pcg.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/krylov/krylov.h000066400000000000000000002147371355566575400166120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int 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_Int 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_Int 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_Int 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_Int 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_Int 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_Int 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_Int 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_Int 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; 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 */ 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_Int 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_PCGSetPrecond ( HYPRE_Solver solver , HYPRE_PtrToSolverFcn precond , HYPRE_PtrToSolverFcn precond_setup , 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_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_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.18.2/src/krylov/lgmres.c000066400000000000000000001173561355566575400165470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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; 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; return (void *) lgmres_data; } /*-------------------------------------------------------------------------- * hypre_LGMRESDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESDestroy( void *lgmres_vdata ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; HYPRE_Int i; 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 ); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_LGMRESGetResidual *--------------------------------------------------------------------------*/ HYPRE_Int hypre_LGMRESGetResidual( void *lgmres_vdata, void **residual ) { /* returns a pointer to the residual vector */ 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); (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*)"gmres.out.log"; } 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... */ (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 = sqrt((*(lgmres_functions->InnerProd))(b,b)); /* Since it is 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); return hypre_error_flag; } r_norm = sqrt((*(lgmres_functions->InnerProd))(p[0],p[0])); r_norm_0 = r_norm; /* Since it is 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); 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= min_iter) { (*(lgmres_functions->CopyVector))(b,r); (*(lgmres_functions->Matvec))(matvec_data,-1.0,A,x,1.0,r); r_norm = 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; iiCopyVector))(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 = 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 = 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 = fabs(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 = pow( r_norm / r_norm_0, 1.0/(2.0*iter)); weight = fabs(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; iiAxpy))(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 = 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; iiCopyVector))(aug_vecs[aug_dim], aug_vecs[spot]); /*need to normalize */ tmp_norm = 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); 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.18.2/src/krylov/lgmres.h000066400000000000000000000115351355566575400165440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/krylov/lobpcg.c000066400000000000000000001024331355566575400165120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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 ); free( work ); 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] = 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_Int 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_Int 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; /* 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 ); free( activeMask ); return exitFlag; } hypre-2.18.2/src/krylov/lobpcg.h000066400000000000000000000062051355566575400165170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #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_Int 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_Int residualNormsHistory_gh ); #ifdef __cplusplus } #endif #endif /* LOCALLY_OPTIMAL_BLOCK_PRECONDITIONED_CONJUGATE_GRADIENTS */ hypre-2.18.2/src/krylov/pcg.c000066400000000000000000001156001355566575400160150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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; 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 -> 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; return (void *) pcg_data; } /*-------------------------------------------------------------------------- * hypre_PCGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PCGDestroy( void *pcg_vdata ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; 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; } hypre_TFreeF( pcg_data, pcg_functions ); hypre_TFreeF( pcg_functions, pcg_functions ); } 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 (*precond_setup)(void*,void*,void*,void*) = (pcg_functions -> precond_setup); void *precond_data = (pcg_data -> precond_data); (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); 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 ); } 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 converged = (pcg_data -> converged); */ void *p = (pcg_data -> p); void *s = (pcg_data -> s); void *r = (pcg_data -> r); 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 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; (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 is 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); 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; } 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 is 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); 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] = 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 ) { /* ++ierr;*/ if (i==1) i_prod=i_prod_0; break; } alpha = gamma / sdotp; gamma_old = gamma; /* x = x + alpha*p */ (*(pcg_functions->Axpy))(alpha, p, x); /* 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))(b, r); (*(pcg_functions->Matvec))(matvec_data, -1.0, A, x, 1.0, r); } /* residual-based stopping criteria: ||r_new-r_old|| < rtol ||b|| */ if (rtol && two_norm) { /* 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", sqrt(drob2)); } break; } } /* s = C*r */ (*(pcg_functions->ClearVector))(s); precond(precond_data, A, r, s); /* gamma = */ gamma = (*(pcg_functions->InnerProd))(r, s); /* residual-based stopping criteria: ||r_new-r_old||_C < rtol ||b||_C */ if (rtol && !two_norm) { /* 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", 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, sqrt(i_prod), (bi_prod ? sqrt(i_prod/bi_prod) : 0)); else hypre_printf("Iter (%d): ||r||_C = %e, ||r||_C/||b||_C = %e\n", i, sqrt(i_prod), (bi_prod ? sqrt(i_prod/bi_prod) : 0)); #endif /* print norm info */ if ( logging>0 || print_level>0 ) { norms[i] = sqrt(i_prod); rel_norms[i] = bi_prod ? 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 an 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); } 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; } if ( (gamma=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; if ( i_prod_0 cf_tol) break; } /*-------------------------------------------------------------------- * back to the core CG calculations *--------------------------------------------------------------------*/ /* beta = gamma / gamma_old */ beta = gamma / 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) hypre_error(HYPRE_ERROR_CONV); (pcg_data -> num_iterations) = i; if (bi_prod > 0.0) (pcg_data -> rel_residual_norm) = sqrt(i_prod/bi_prod); else /* actually, we'll never get here... */ (pcg_data -> rel_residual_norm) = 0.0; 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_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_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.18.2/src/krylov/pcg.h000066400000000000000000000153241355566575400160240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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. */ 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; 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 */ 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.18.2/src/lapack/000077500000000000000000000000001355566575400150025ustar00rootroot00000000000000hypre-2.18.2/src/lapack/CMakeLists.txt000066400000000000000000000024361355566575400175470ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 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 ) convert_filenames_to_full_paths(SRCS) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) # 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 () hypre-2.18.2/src/lapack/COPYING000066400000000000000000000031071355566575400160360ustar00rootroot00000000000000Copyright (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.18.2/src/lapack/Makefile000066400000000000000000000033561355566575400164510ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/lapack/README000066400000000000000000000004511355566575400156620ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/lapack/_hypre_lapack.h000066400000000000000000000264151355566575400177640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/lapack/dbdsqr.c000066400000000000000000000575771355566575400164520ustar00rootroot00000000000000/* 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) */ /* Table of constant values */ static doublereal c_b15 = -.125; static integer c__1 = 1; static doublereal c_b49 = 1.; static doublereal c_b72 = -1.; /* 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 */ static doublereal abse; static integer idir; static doublereal abss; static integer oldm; static doublereal cosl; static integer isub, iter; static doublereal unfl, sinl, cosr, smin, smax, sinr; extern /* Subroutine */ integer drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *), dlas2_( doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static doublereal f, g, h__; static integer i__, j, m; static doublereal r__; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *,const char *); static doublereal oldcs; extern /* Subroutine */ integer dlasr_(const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *); static integer oldll; static doublereal shift, sigmn, oldsn; extern /* Subroutine */ integer dswap_(integer *, doublereal *, integer *, doublereal *, integer *); static integer maxit; static doublereal sminl, sigmx; static logical lower; extern /* Subroutine */ integer dlasq1_(integer *, doublereal *, doublereal *, doublereal *, integer *), dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static doublereal cs; static integer ll; extern doublereal dlamch_(const char *); static doublereal sn, mu; extern /* Subroutine */ integer dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), xerbla_(const char *, integer *); static doublereal sminoa, thresh; static logical rotate; static integer nm1; static doublereal tolmul; static integer nm12, nm13, lll; static doublereal eps, sll, tol; #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.18.2/src/lapack/dgebd2.c000066400000000000000000000215351355566575400163030ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static 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.18.2/src/lapack/dgebrd.c000066400000000000000000000252751355566575400164100ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b21 = -1.; static doublereal c_b22 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static integer i__, j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static integer nbmin, iinfo, minmn; extern /* Subroutine */ integer dgebd2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *); static integer nb; extern /* Subroutine */ integer dlabrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *); static integer nx; static doublereal ws; extern /* Subroutine */ integer xerbla_(const char *, integer *); extern integer ilaenv_(integer *, const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); static integer ldwrkx, ldwrky, lwkopt; static 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.18.2/src/lapack/dgelq2.c000066400000000000000000000076441355566575400163370ustar00rootroot00000000000000/* 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 */ static 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 *); static 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.18.2/src/lapack/dgelqf.c000066400000000000000000000157361355566575400164240ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static integer i__, k, nbmin, iinfo; extern /* Subroutine */ integer dgelq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dgels.c000066400000000000000000000343021355566575400162460ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b33 = 0.; static integer c__0 = 0; static doublereal c_b61 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ static doublereal anrm, bnrm; static integer brow; static logical tpsd; static 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 *); static integer wsize; static doublereal rwork[1]; extern /* Subroutine */ integer dlabad_(doublereal *, doublereal *); static integer nb; extern doublereal dlamch_(const char *), dlange_(const char *, integer *, integer *, doublereal *, integer *, doublereal *); static 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); static integer scllen; static 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 *); static doublereal smlnum; static 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.18.2/src/lapack/dgeqr2.c000066400000000000000000000077531355566575400163460ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static 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 *); static 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.18.2/src/lapack/dgeqrf.c000066400000000000000000000157671355566575400164360ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static integer i__, k, nbmin, iinfo; extern /* Subroutine */ integer dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dgesvd.c000066400000000000000000003772241355566575400164410ustar00rootroot00000000000000/* 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) */ /* Table of constant values */ static integer c__6 = 6; static integer c__0 = 0; static integer c__2 = 2; static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b416 = 0.; static doublereal c_b438 = 1.; /* 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 */ static integer iscl; static doublereal anrm; static 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 *); static integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork; static logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; static integer ie; 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 *); static integer ir, bdspac, 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 *); static 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 *); static integer ldwrkr, minwrk, ldwrku, maxwrk; static doublereal smlnum; static logical lquery, wntuas, wntvas; static integer blk, ncu; static doublereal dum[1], eps; static integer nru; #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; 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.18.2/src/lapack/dgetf2.c000066400000000000000000000106411355566575400163230ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static 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 *); static integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dswap_(integer *, doublereal *, integer *, doublereal *, integer *); static 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.18.2/src/lapack/dgetrf.c000066400000000000000000000136041355566575400164250ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; static doublereal c_b19 = -1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ static integer i__, j; extern /* Subroutine */ integer dgemm_(const char *,const char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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.18.2/src/lapack/dgetri.c000066400000000000000000000160461355566575400164330ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b20 = -1.; static doublereal c_b22 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static 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 *); static 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 *); static 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); static integer ldwork; extern /* Subroutine */ integer dtrtri_(const char *, const char *, integer *, doublereal *, integer *, integer *); static integer lwkopt; static logical lquery; static 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.18.2/src/lapack/dgetrs.c000066400000000000000000000112461355566575400164420ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static doublereal c_b12 = 1.; static 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 *); static 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.18.2/src/lapack/dlabad.c000066400000000000000000000040641355566575400163610ustar00rootroot00000000000000/* 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.18.2/src/lapack/dlabrd.c000066400000000000000000000334201355566575400164000ustar00rootroot00000000000000/* 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 */ static doublereal c_b4 = -1.; static doublereal c_b5 = 1.; static integer c__1 = 1; static 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 */ static 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.18.2/src/lapack/dlacpy.c000066400000000000000000000057361355566575400164350ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dlae2.c000066400000000000000000000063651355566575400161470ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dlaev2.c000066400000000000000000000104501355566575400163230ustar00rootroot00000000000000/* 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 */ static doublereal acmn, acmx, ab, df, cs, ct, tb, sm, tn, rt, adf, acs; static 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.18.2/src/lapack/dlamch.c000066400000000000000000000602571355566575400164100ustar00rootroot00000000000000/* 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 */ static logical first = TRUE_; /* System generated locals */ integer i__1; doublereal ret_val; /* Builtin functions */ doublereal pow_di(doublereal *, integer *); /* Local variables */ static doublereal base; static integer beta; static doublereal emin, prec, emax; static integer imin, imax; static logical lrnd; static doublereal rmin, rmax, t, rmach; extern logical lsame_(const char *,const char *); static doublereal small, sfmin; extern /* Subroutine */ integer dlamc2_(integer *, integer *, logical *, doublereal *, integer *, doublereal *, integer *, doublereal *); static integer it; static 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 */ static logical first = TRUE_; /* System generated locals */ doublereal d__1, d__2; /* Local variables */ static logical lrnd; static doublereal a, b, c, f; static integer lbeta; static doublereal savec; extern doublereal dlamc3_(doublereal *, doublereal *); static logical lieee1; static doublereal t1, t2; static integer lt; static 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 */ /***static integer c__1 = 1;***/ /* Initialized data */ static logical first = TRUE_; static 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 */ static logical ieee; static doublereal half; static logical lrnd; static doublereal leps, zero, a, b, c; static integer i, lbeta; static doublereal rbase; static integer lemin, lemax, gnmin; static doublereal small; static integer gpmin; static doublereal third, lrmin, lrmax, sixth; extern /* Subroutine */ integer dlamc1_(integer *, integer *, logical *, logical *); extern doublereal dlamc3_(doublereal *, doublereal *); static logical lieee1; extern /* Subroutine */ integer dlamc4_(integer *, doublereal *, integer *), dlamc5_(integer *, integer *, integer *, logical *, integer *, doublereal *); static integer lt, ngnmin, ngpmin; static 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 */ static doublereal zero, a; static integer i; static doublereal rbase, b1, b2, c1, c2, d1, d2; extern doublereal dlamc3_(doublereal *, doublereal *); static 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 */ static doublereal c_b5 = 0.; /* System generated locals */ /***integer i__1;***/ doublereal d__1; /* Local variables */ static integer lexp; static doublereal oldy; static integer uexp, i; static doublereal y, z; static integer nbits; extern doublereal dlamc3_(doublereal *, doublereal *); static doublereal recbas; static integer exbits, expsum, try__; 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 * *beta; y = dlamc3_(&d__1, &c_b5); /* L30: */ } *rmax = y; return 0; /* End of DLAMC5 */ } /* dlamc5_ */ #ifdef __cplusplus } #endif hypre-2.18.2/src/lapack/dlange.c000066400000000000000000000110741355566575400164030ustar00rootroot00000000000000/* 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 */ static 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 */ static integer i__, j; static doublereal scale; extern logical lsame_(const char *,const char *); static doublereal value; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); static 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; /* 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.18.2/src/lapack/dlanst.c000066400000000000000000000076631355566575400164470ustar00rootroot00000000000000/* 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 */ static 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 */ static integer i__; static doublereal scale; extern logical lsame_(const char *,const char *); static doublereal anorm; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); static doublereal sum; --e; --d__; /* 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.18.2/src/lapack/dlansy.c000066400000000000000000000137471355566575400164540ustar00rootroot00000000000000/* 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 */ static 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 */ static doublereal absa; static integer i__, j; static doublereal scale; extern logical lsame_(const char *,const char *); static doublereal value; extern /* Subroutine */ integer dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); static 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; /* 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.18.2/src/lapack/dlapy2.c000066400000000000000000000025401355566575400163420ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dlarf.c000066400000000000000000000074621355566575400162470ustar00rootroot00000000000000/* 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 */ static doublereal c_b4 = 1.; static doublereal c_b5 = 0.; static 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.18.2/src/lapack/dlarfb.c000066400000000000000000000444661355566575400164160ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static doublereal c_b14 = 1.; static 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 */ static 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 *); static 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.18.2/src/lapack/dlarfg.c000066400000000000000000000075251355566575400164160ustar00rootroot00000000000000/* 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 */ static doublereal beta; extern doublereal dnrm2_(integer *, doublereal *, integer *); static integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); static doublereal xnorm; extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(const char *); static doublereal safmin, rsafmn; static 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.18.2/src/lapack/dlarft.c000066400000000000000000000175501355566575400164320ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static 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 */ static 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 *); static 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.18.2/src/lapack/dlartg.c000066400000000000000000000101471355566575400164260ustar00rootroot00000000000000/* 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 */ static 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 */ static integer i__; static doublereal scale; static integer count; static doublereal f1, g1, safmn2, safmx2; extern doublereal dlamch_(const char *); // static 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.18.2/src/lapack/dlas2.c000066400000000000000000000067541355566575400161670ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dlascl.c000066400000000000000000000173641355566575400164230ustar00rootroot00000000000000/* 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 */ static logical done; static doublereal ctoc; static integer i__, j; extern logical lsame_(const char *,const char *); static integer itype, k1, k2, k3, k4; static doublereal cfrom1; extern doublereal dlamch_(const char *); static doublereal cfromc; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/lapack/dlaset.c000066400000000000000000000072221355566575400164250ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dlasq1.c000066400000000000000000000132351355566575400163370ustar00rootroot00000000000000/* 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) */ /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; static integer c__0 = 0; /* 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 *); static integer i__; static doublereal scale; static integer iinfo; static doublereal sigmn; extern /* Subroutine */ integer dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); static 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 *); static doublereal safmin; extern /* Subroutine */ integer xerbla_(const char *, integer *), dlasrt_( const char *, integer *, doublereal *, integer *); static doublereal eps; /* -- 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.18.2/src/lapack/dlasq2.c000066400000000000000000000322221355566575400163350ustar00rootroot00000000000000/* 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) */ /* Table of constant values */ static integer c__1 = 1; static integer c__2 = 2; static integer c__10 = 10; static integer c__3 = 3; static integer c__4 = 4; static integer c__11 = 11; /* 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 */ static logical ieee; static integer nbig; static doublereal dmin__, emin, emax; static integer ndiv, iter; static doublereal qmin, temp, qmax, zmax; static integer splt; static doublereal d__, e; static integer k; static doublereal s, t; static integer nfail; static doublereal desig, trace, sigma; static 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 *); static integer pp, iwhila, iwhilb; static 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 *); static doublereal eps, tol; static integer ipn4; static doublereal tol2; /* -- 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.18.2/src/lapack/dlasq3.c000066400000000000000000000176271355566575400163520ustar00rootroot00000000000000/* 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 */ static integer ttype = 0; static doublereal dmin1 = 0.; static doublereal dmin2 = 0.; static doublereal dn = 0.; static doublereal dn1 = 0.; static doublereal dn2 = 0.; static doublereal tau = 0.; /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ static doublereal temp, s, t; static 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 *); static integer nn; static doublereal safmin, eps, tol; static integer n0in, ipn4; static 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.18.2/src/lapack/dlasq4.c000066400000000000000000000203731355566575400163430ustar00rootroot00000000000000/* 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 */ static doublereal g = 0.; /* System generated locals */ integer i__1; doublereal d__1, d__2; /* Local variables */ static doublereal s, a2, b1, b2; static integer i4, nn, np; static 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__; /* 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.18.2/src/lapack/dlasq5.c000066400000000000000000000122301355566575400163350ustar00rootroot00000000000000/* 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 */ static doublereal emin, temp, d__; static 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.18.2/src/lapack/dlasq6.c000066400000000000000000000116351355566575400163460ustar00rootroot00000000000000/* 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 */ static doublereal emin, temp, d__; static integer j4; extern doublereal dlamch_(const char *); static doublereal safmin; static 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.18.2/src/lapack/dlasr.c000066400000000000000000000246211355566575400162600ustar00rootroot00000000000000/* 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 */ static integer info; static doublereal temp; static integer i__, j; extern logical lsame_(const char *,const char *); static 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.18.2/src/lapack/dlasrt.c000066400000000000000000000125031355566575400164400ustar00rootroot00000000000000/* 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 */ static integer endd, i__, j; extern logical lsame_(const char *,const char *); static integer stack[64] /* was [2][32] */; static doublereal dmnmx, d1, d2, d3; static integer start; extern /* Subroutine */ integer xerbla_(const char *, integer *); static integer stkpnt, dir; static 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.18.2/src/lapack/dlassq.c000066400000000000000000000055121355566575400164400ustar00rootroot00000000000000/* 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 */ static doublereal absxi; static 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.18.2/src/lapack/dlasv2.c000066400000000000000000000142641355566575400163500ustar00rootroot00000000000000/* 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 */ static doublereal c_b3 = 2.; static doublereal c_b4 = 1.; /* System generated locals */ doublereal d__1; /* Builtin functions */ doublereal d_sign(doublereal *, doublereal *); /* Local variables */ static integer pmax; static doublereal temp; static logical swap; static doublereal a, d__, l, m, r__, s, t, tsign, fa, ga, ha; extern doublereal dlamch_(const char *); static doublereal ft, gt, ht, mm; static logical gasmal; static 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.18.2/src/lapack/dlaswp.c000066400000000000000000000071721355566575400164470ustar00rootroot00000000000000/* 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 */ static doublereal temp; static 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.18.2/src/lapack/dlatrd.c000066400000000000000000000264531355566575400164320ustar00rootroot00000000000000/* 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 */ static doublereal c_b5 = -1.; static doublereal c_b6 = 1.; static integer c__1 = 1; static 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 *); static integer i__; static 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 *); static 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.18.2/src/lapack/dorg2l.c000066400000000000000000000102361355566575400163410ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; /* Local variables */ static integer i__, j, l; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *), dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); static 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.18.2/src/lapack/dorg2r.c000066400000000000000000000101241355566575400163430ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ static 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.18.2/src/lapack/dorgbr.c000066400000000000000000000202721355566575400164300ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static integer i__, j; extern logical lsame_(const char *,const char *); static integer iinfo; static logical wantq; static 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 *); static integer lwkopt; static 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.18.2/src/lapack/dorgl2.c000066400000000000000000000100241355566575400163340ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/dorglq.c000066400000000000000000000166401355566575400164450ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorgl2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dorgql.c000066400000000000000000000171071355566575400164440ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorg2l_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dorgqr.c000066400000000000000000000167201355566575400164520ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static integer i__, j, l, nbmin, iinfo; extern /* Subroutine */ integer dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dorgtr.c000066400000000000000000000146051355566575400164550ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static integer i__, j; extern logical lsame_(const char *,const char *); static integer iinfo; static logical upper; static 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 *); static integer lwkopt; static 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.18.2/src/lapack/dorm2r.c000066400000000000000000000133001355566575400163500ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; /* Local variables */ static logical left; static integer i__; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical lsame_(const char *,const char *); static integer i1, i2, i3, ic, jc, mi, ni, nq; extern /* Subroutine */ integer xerbla_(const char *, integer *); static logical notran; static 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.18.2/src/lapack/dormbr.c000066400000000000000000000244771355566575400164510ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static 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 */ static logical left; extern logical lsame_(const char *,const char *); static 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 *); static logical notran; extern /* Subroutine */ integer dormqr_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *); static logical applyq; static char transt[1]; static integer lwkopt; static 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.18.2/src/lapack/dorml2.c000066400000000000000000000132221355566575400163450ustar00rootroot00000000000000/* 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 */ static logical left; static integer i__; extern /* Subroutine */ integer dlarf_(const char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *); extern logical lsame_(const char *,const char *); static integer i1, i2, i3, ic, jc, mi, ni, nq; extern /* Subroutine */ integer xerbla_(const char *, integer *); static logical notran; static 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.18.2/src/lapack/dormlq.c000066400000000000000000000221651355566575400164520ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static 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 */ static logical left; static integer i__; static doublereal t[4160] /* was [65][64] */; extern logical lsame_(const char *,const char *); static integer nbmin, iinfo, i1, i2, i3; extern /* Subroutine */ integer dorml2_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); static 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 *); static 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); static logical notran; static integer ldwork; static char transt[1]; static integer lwkopt; static logical lquery; static 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.18.2/src/lapack/dormqr.c000066400000000000000000000217171355566575400164620ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static 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 */ static logical left; static integer i__; static doublereal t[4160] /* was [65][64] */; extern logical lsame_(const char *,const char *); static integer nbmin, iinfo, i1, i2, i3; extern /* Subroutine */ integer dorm2r_(const char *,const char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); static 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 *); static 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); static logical notran; static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dpotf2.c000066400000000000000000000127501355566575400163510ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static doublereal c_b10 = -1.; static 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 *); static 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 *); static logical upper; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/lapack/dpotrf.c000066400000000000000000000153051355566575400164500ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b13 = -1.; static doublereal c_b14 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ static 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 *); static 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 *); static 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.18.2/src/lapack/dpotrs.c000066400000000000000000000100151355566575400164560ustar00rootroot00000000000000/* 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 */ static 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 *); static 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.18.2/src/lapack/dsteqr.c000066400000000000000000000344201355566575400164530ustar00rootroot00000000000000/* 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 */ static doublereal c_b9 = 0.; static doublereal c_b10 = 1.; static integer c__0 = 0; static integer c__1 = 1; static 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 */ static integer lend, jtot; extern /* Subroutine */ integer dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static doublereal b, c__, f, g; static integer i__, j, k, l, m; static 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 *); static doublereal anorm; extern /* Subroutine */ integer dswap_(integer *, doublereal *, integer *, doublereal *, integer *); static integer l1; extern /* Subroutine */ integer dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static integer lendm1, lendp1; extern doublereal dlapy2_(doublereal *, doublereal *); static integer ii; extern doublereal dlamch_(const char *); static 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 *); static doublereal safmin; extern /* Subroutine */ integer dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static 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 *); static integer lendsv; static doublereal ssfmin; static integer nmaxit, icompz; static doublereal ssfmax; static integer lm1, mm1, nm1; static doublereal rt1, rt2, eps; static integer lsv; static 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.18.2/src/lapack/dsterf.c000066400000000000000000000224001355566575400164330ustar00rootroot00000000000000/* 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 */ static integer c__0 = 0; static integer c__1 = 1; static 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 */ static doublereal oldc; static integer lend, jtot; extern /* Subroutine */ integer dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static doublereal c__; static integer i__, l, m; static doublereal p, gamma, r__, s, alpha, sigma, anorm; static integer l1; extern doublereal dlapy2_(doublereal *, doublereal *); static doublereal bb; extern doublereal dlamch_(const char *); static integer iscale; extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); static doublereal oldgam, safmin; extern /* Subroutine */ integer xerbla_(const char *, integer *); static doublereal safmax; extern doublereal dlanst_(const char *, integer *, doublereal *, doublereal *); extern /* Subroutine */ integer dlasrt_(const char *, integer *, doublereal *, integer *); static integer lendsv; static doublereal ssfmin; static integer nmaxit; static doublereal ssfmax, rt1, rt2, eps, rte; static integer lsv; static 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.18.2/src/lapack/dsyev.c000066400000000000000000000200431355566575400162770ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b17 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; /* Local variables */ static integer inde; static doublereal anrm; static integer imax; static doublereal rmin, rmax; /***static integer lopt;***/ extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); static doublereal sigma; extern logical lsame_(const char *,const char *); static integer iinfo; static logical lower, wantz; static integer nb; extern doublereal dlamch_(const char *); static integer iscale; extern /* Subroutine */ integer dlascl_(const char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, integer *); static doublereal safmin; extern integer ilaenv_(integer *,const char *,const char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ integer xerbla_(const char *, integer *); static doublereal bignum; static integer indtau; extern /* Subroutine */ integer dsterf_(integer *, doublereal *, doublereal *, integer *); extern doublereal dlansy_(const char *,const char *, integer *, doublereal *, integer *, doublereal *); static 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 *); static integer llwork; static doublereal smlnum; static integer lwkopt; static logical lquery; static 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.18.2/src/lapack/dsygs2.c000066400000000000000000000200641355566575400163630ustar00rootroot00000000000000/* 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 */ static doublereal c_b6 = -1.; static integer c__1 = 1; static 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 *); static 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 *); static 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 *); static doublereal ct; extern /* Subroutine */ integer xerbla_(const char *, integer *); static 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.18.2/src/lapack/dsygst.c000066400000000000000000000242471355566575400164740ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b14 = 1.; static doublereal c_b16 = -.5; static doublereal c_b19 = -1.; static doublereal c_b52 = .5; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; /* Local variables */ static 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 *); static 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 *); static integer kb; extern /* Subroutine */ integer dsyr2k_(const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static 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.18.2/src/lapack/dsygv.c000066400000000000000000000213551355566575400163100ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; /* Local variables */ static 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 *); static char trans[1]; extern /* Subroutine */ integer dtrsm_(const char *,const char *,const char *,const char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); static logical upper; extern /* Subroutine */ integer dsyev_(const char *,const char *, integer *, doublereal * , integer *, doublereal *, doublereal *, integer *, integer *); static logical wantz; static 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 *); static integer lwkopt; static 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.18.2/src/lapack/dsytd2.c000066400000000000000000000215631355566575400163660ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static doublereal c_b8 = 0.; static 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 *); static doublereal taui; extern /* Subroutine */ integer dsyr2_(const char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *); static integer i__; static doublereal alpha; extern logical lsame_(const char *,const char *); extern /* Subroutine */ integer daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); static 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.18.2/src/lapack/dsytrd.c000066400000000000000000000254361355566575400164710ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b22 = -1.; static doublereal c_b23 = 1.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ static integer i__, j; extern logical lsame_(const char *,const char *); static integer nbmin, iinfo; static 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 *); static 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); static integer ldwork, lwkopt; static logical lquery; static 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.18.2/src/lapack/dtrti2.c000066400000000000000000000110421355566575400163540ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; /* Local variables */ static integer j; extern /* Subroutine */ integer dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(const char *, const char *); static logical upper; extern /* Subroutine */ integer dtrmv_(const char *, const char *, const char *, integer *, doublereal *, integer *, doublereal *, integer *), xerbla_(const char *, integer *); static logical nounit; static 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.18.2/src/lapack/dtrtri.c000066400000000000000000000150241355566575400164600ustar00rootroot00000000000000/* 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 */ static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b18 = 1.; static 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 */ static 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 *); static logical upper; extern /* Subroutine */ integer dtrti2_(const char *, const char *, integer *, doublereal *, integer *, integer *); static 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); static 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.18.2/src/lapack/f2c.h000066400000000000000000000142411355566575400156270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #if defined(HYPRE_SINGLE) #define sqrt sqrtf #elif defined(HYPRE_LONG_DOUBLE) #define sqrt sqrtl #endif #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)(); 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)(); #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.18.2/src/lapack/hypre_lapack.h000066400000000000000000000077271355566575400176320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/lapack/ieeeck.c000066400000000000000000000060701355566575400163760ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/ilaenv.c000066400000000000000000000452771355566575400164430ustar00rootroot00000000000000/* 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 */ static integer c__0 = 0; static real c_b162 = 0.f; static real c_b163 = 1.f; static 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 */ static integer i__; static logical cname, sname; static integer nbmin; static char c1[1], c2[2], c3[3], c4[2]; static integer ic, nb; extern integer ieeeck_(integer *, real *, real *); static integer iz, nx; static char subnam[6]; 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.18.2/src/lapack/lsame.c000066400000000000000000000052251355566575400162530ustar00rootroot00000000000000/* 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 */ static 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.18.2/src/lapack/xerbla.c000066400000000000000000000026161355566575400164300ustar00rootroot00000000000000/* 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.18.2/src/lib/000077500000000000000000000000001355566575400143155ustar00rootroot00000000000000hypre-2.18.2/src/lib/Makefile000066400000000000000000000060471355566575400157640ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 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 PARCSRMVFILES = ${HYPRE_SRC_TOP_DIR}/parcsr_mv/*.o PARCSRBLOCKMVFILES = ${HYPRE_SRC_TOP_DIR}/parcsr_block_mv/*.o SEQMVFILES = ${HYPRE_SRC_TOP_DIR}/seq_mv/*.o SSTRUCTLSFILES = ${HYPRE_SRC_TOP_DIR}/sstruct_ls/*.o SSTRUCTMVFILES = ${HYPRE_SRC_TOP_DIR}/sstruct_mv/*.o STRUCTLSFILES = ${HYPRE_SRC_TOP_DIR}/struct_ls/*.o STRUCTMVFILES = ${HYPRE_SRC_TOP_DIR}/struct_mv/*.o UTILITIESFILES = ${HYPRE_SRC_TOP_DIR}/utilities/*.o 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)\ $(SSTRUCTLSFILES)\ $(SSTRUCTMVFILES)\ $(STRUCTLSFILES)\ $(STRUCTMVFILES)\ $(UTILITIESFILES)\ $(BLASFILES)\ $(LAPACKFILES) SONAME = libHYPRE-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} SOLIBS = ${DSUPERLU_LIBS} ${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 ################################################################## libHYPRE.a: ${FILES_HYPRE} @echo "Building libHYPRE ... " rm -f $@ ${AR} $@ $(FEIHYPREFILES) $(FEMLIFILES) $(IJMVFILES) ${AR} $@ $(EUCLIDFILES) ${AR} $@ $(PARASAILSFILES) ${AR} $@ $(PILUTFILES) ${AR} $@ $(DISTMATRIXFILES) ${AR} $@ $(KRYLOVFILES) ${AR} $@ $(MATMATFILES) ${AR} $@ $(MULTIVECFILES) ${AR} $@ $(PARCSRLSFILES) ${AR} $@ $(PARCSRMVFILES) ${AR} $@ $(PARCSRBLOCKMVFILES) ${AR} $@ $(SEQMVFILES) ${AR} $@ $(SSTRUCTLSFILES) ${AR} $@ $(SSTRUCTMVFILES) ${AR} $@ $(STRUCTLSFILES) ${AR} $@ $(STRUCTMVFILES) ${AR} $@ $(UTILITIESFILES) $(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 ${SONAME} $@ hypre-2.18.2/src/matrix_matrix/000077500000000000000000000000001355566575400164375ustar00rootroot00000000000000hypre-2.18.2/src/matrix_matrix/CMakeLists.txt000066400000000000000000000010411355566575400211730ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/matrix_matrix/HYPRE_BuildIJMatrixFromDistributedMatrix.c000066400000000000000000000077251355566575400264500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/matrix_matrix/HYPRE_ConvertPETScMatrixToDistributedMatrix.c000066400000000000000000000055361355566575400271220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "hypre_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.18.2/src/matrix_matrix/HYPRE_ConvertParCSRMatrixToDistributedMatrix.c000066400000000000000000000043061355566575400272700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_general.h" #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.18.2/src/matrix_matrix/HYPRE_matrix_matrix_protos.h000066400000000000000000000014421355566575400240560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/matrix_matrix/Makefile000066400000000000000000000032021355566575400200740ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/matrix_matrix/internal_protos.h000066400000000000000000000010271355566575400220320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/multivector/000077500000000000000000000000001355566575400161245ustar00rootroot00000000000000hypre-2.18.2/src/multivector/CMakeLists.txt000066400000000000000000000011431355566575400206630ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/multivector/Makefile000066400000000000000000000026611355566575400175710ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/multivector/backup.c000066400000000000000000000324341355566575400175430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" 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]); free(data->vector); } if ( data->mask && data->ownsMask ) free(data->mask); free(data); } 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]); free(ps); free(pd); } 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]); free(px); free(py); } 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; } free(px); free(py); } 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]); free(index); free(px); free(py); } 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; } free(px); free(py); } 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; } free(px); free(py); } 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]); } free(px); free(py); free( index ); } 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] ); free(px); free(py); } 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.18.2/src/multivector/csr_matmultivec.c000066400000000000000000000231241355566575400214730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * 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; 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 #include #include #include "multivector.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 ); free( v ); } 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_Int 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_Int 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_Int 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.18.2/src/multivector/multivector.h000066400000000000000000000064411355566575400206570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "interpreter.h" #include "_hypre_utilities.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_Int 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_Int 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_Int 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.18.2/src/multivector/par_csr_matmultivec.c000066400000000000000000000264341355566575400223440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * 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.18.2/src/multivector/par_csr_matmultivec.h000066400000000000000000000023221355566575400223370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/multivector/par_csr_pmvcomm.c000066400000000000000000000136171355566575400214670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/multivector/par_csr_pmvcomm.h000066400000000000000000000041651355566575400214720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/multivector/par_multivector.c000066400000000000000000000365041355566575400215170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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_ParMultiVectorSetPartitioningOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParMultiVectorSetPartitioningOwner( hypre_ParMultiVector *pm_vector, HYPRE_Int owns_partitioning) { hypre_ParMultiVectorOwnsPartitioning(pm_vector) = owns_partitioning; return 0; } /*-------------------------------------------------------------------------- * 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_Int 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_Int 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->owns_partitioning=0; 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->owns_partitioning=0; 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; ilocal_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); /* this vector WON'T own partitioning */ hypre_ParVectorSetPartitioningOwner(temp_vec,0); /* 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); /* this vector WILL own the partitioning */ hypre_ParMultiVectorSetPartitioningOwner(x,1); 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 (icomm,vector->global_size, vector->partitioning); hypre_assert(temp_vec!=NULL); temp_vec->owns_partitioning=0; 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.18.2/src/multivector/par_multivector.h000066400000000000000000000125131355566575400215160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 owns_partitioning; 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_ParMultiVectorOwnsPartitioning(vector) ((vector) -> owns_partitioning) #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_ParMultiVectorSetPartitioningOwner(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_Int rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_ParMultiVector * y); HYPRE_Int hypre_ParMultiVectorXapy(hypre_ParMultiVector *x, HYPRE_Int 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.18.2/src/multivector/seq_multivector.c000066400000000000000000000401371355566575400215220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include /*-------------------------------------------------------------------------- * hypre_SeqMultivectorCreate *--------------------------------------------------------------------------*/ hypre_Multivector * hypre_SeqMultivectorCreate( HYPRE_Int size, HYPRE_Int num_vectors ) { hypre_Multivector *mvector; mvector = (hypre_Multivector *) hypre_MAlloc(sizeof(hypre_Multivector), 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_Complex *) hypre_MAlloc(sizeof(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; iactive_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; iactive_indices[mvector->num_active_vectors++]=i; } else for (i=0; iactive_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_Memcpy(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_Memcpy(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; inum_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; i0); 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 - rHeight; for (j=0; jnum_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 - rHeight; for (j=0; j 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_Int rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y); HYPRE_Int hypre_SeqMultivectorXapy (hypre_Multivector *x, HYPRE_Int rGHeight, HYPRE_Int rHeight, HYPRE_Int rWidth, HYPRE_Complex* rVal, hypre_Multivector *y); #ifdef __cplusplus } #endif #endif /* hypre_MULTIVECTOR_HEADER */ hypre-2.18.2/src/multivector/temp_multivector.c000066400000000000000000000273161355566575400217030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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]); free(x->vector); } if ( x->mask && x->ownsMask ) free(x->mask); free(x); } 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]); free(ps); free(pd); } 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]); free(px); free(py); } void mv_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; 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 - 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; } free(px); free(py); } 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]); free(index); free(px); free(py); } void mv_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; 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 - 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; } free(px); free(py); } void mv_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; 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 - 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; } free(px); free(py); } 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]); } free(px); free(py); free( index ); } 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] ); free(px); free(py); } hypre-2.18.2/src/multivector/temp_multivector.h000066400000000000000000000076111355566575400217040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_longint 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_; 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_Int 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_Int gh, HYPRE_Int h, HYPRE_Int w, HYPRE_Complex* v, void* ); void mv_TempMultiVectorXapy( void* x, HYPRE_Int 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.18.2/src/nopoe000077500000000000000000000035331355566575400146210ustar00rootroot00000000000000#!/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.18.2/src/parcsr_block_mv/000077500000000000000000000000001355566575400167155ustar00rootroot00000000000000hypre-2.18.2/src/parcsr_block_mv/CMakeLists.txt000066400000000000000000000013111355566575400214510ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/parcsr_block_mv/Makefile000066400000000000000000000065611355566575400203650ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../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 ${SONAME} $@ ${OBJS}: ${HEADERS} ${DRIVER_OBJS}: ${HEADERS} hypre-2.18.2/src/parcsr_block_mv/_hypre_parcsr_block_mv.h000066400000000000000000000010041355566575400235750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/parcsr_block_mv/csr_block_matop.c000066400000000000000000000173541355566575400222340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_block_mv/csr_block_matrix.c000066400000000000000000001434641355566575400224220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- * 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] = 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 = 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 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.18.2/src/parcsr_block_mv/csr_block_matrix.h000066400000000000000000000144611355566575400224210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_block_mv/csr_block_matvec.c000066400000000000000000000211451355566575400223640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * 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.18.2/src/parcsr_block_mv/driver_matvec.c000066400000000000000000000564711355566575400217300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_ParVectorSetPartitioningOwner(x,0); 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_ParVectorSetPartitioningOwner(y,0); 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_ParVectorSetPartitioningOwner(y,0); 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.18.2/src/parcsr_block_mv/par_block_nodal_systems.c000066400000000000000000000245051355566575400237670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_BigInt *row_starts_AN; 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 ierr = 0; 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts_AN = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i=0; i < 2; i++) { row_starts_AN[i] = row_starts[i]; } #else row_starts_AN = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) { row_starts_AN[i] = row_starts[i]; } #endif 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) { comm_pkg_AN = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_AN) = comm; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_ParCSRCommPkgNumSends(comm_pkg_AN) = num_sends; num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); hypre_ParCSRCommPkgNumRecvs(comm_pkg_AN) = num_recvs; 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); send_map_starts_AN[0] = 0; 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]; } hypre_ParCSRCommPkgSendProcs(comm_pkg_AN) = send_procs_AN; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_AN) = send_map_starts_AN; hypre_ParCSRCommPkgSendMapElmts(comm_pkg_AN) = send_map_elmts_AN; recv_procs = hypre_ParCSRCommPkgRecvProcs(comm_pkg); recv_vec_starts = hypre_ParCSRCommPkgRecvVecStarts(comm_pkg); 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); recv_vec_starts_AN[0] = recv_vec_starts[0]; 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]; } hypre_ParCSRCommPkgRecvProcs(comm_pkg_AN) = recv_procs_AN; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_AN) = recv_vec_starts_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_AN, row_starts_AN, 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 (ierr); } hypre-2.18.2/src/parcsr_block_mv/par_csr_block_comm.c000066400000000000000000000210421355566575400226760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_LocateAssummedPartition(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.18.2/src/parcsr_block_mv/par_csr_block_interp.c000066400000000000000000010313101355566575400232440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, hypre_ParCSRBlockMatrix **P_ptr ) { 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; 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; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_BigInt *P_row_starts, *A_col_starts; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); /* num_threads = hypre_NumThreads(); */ num_threads = 1; #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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); } /* copy row starts since A will be destroyed */ A_col_starts = hypre_ParCSRBlockMatrixColStarts(A); #ifdef HYPRE_NO_GLOBAL_PARTITION P_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < 2; i++) { P_row_starts[i] = A_col_starts[i]; } #else P_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < num_procs + 1; i++) { P_row_starts[i] = A_col_starts[i]; } #endif /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, P_row_starts, 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(0); } /* 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 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_Int *col_offd_S_to_A, hypre_ParCSRBlockMatrix **P_ptr) { 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; 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, 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; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_BigInt *P_row_starts, *A_col_starts; HYPRE_Real *sign; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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); } /* copy row starts since A will be destroyed */ A_col_starts = hypre_ParCSRBlockMatrixColStarts(A); #ifdef HYPRE_NO_GLOBAL_PARTITION P_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < 2; i++) { P_row_starts[i] = A_col_starts[i]; } #else P_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < num_procs + 1; i++) { P_row_starts[i] = A_col_starts[i]; } #endif /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, P_row_starts, 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_Int *col_offd_S_to_A, hypre_ParCSRBlockMatrix **P_ptr) { 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; 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; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_BigInt *P_row_starts, *A_col_starts; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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); } /* copy row starts since A will be destroyed */ A_col_starts = hypre_ParCSRBlockMatrixColStarts(A); #ifdef HYPRE_NO_GLOBAL_PARTITION P_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < 2; i++) { P_row_starts[i] = A_col_starts[i]; } #else P_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < num_procs + 1; i++) { P_row_starts[i] = A_col_starts[i]; } #endif /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, P_row_starts, 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_Int *col_offd_S_to_A, hypre_ParCSRBlockMatrix **P_ptr) { 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; 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; /* for debugging instrumentation */ HYPRE_Real *identity_block; HYPRE_Real *zero_block; HYPRE_Real *diagonal_block; HYPRE_Real *sum_block; HYPRE_Real *distribute_block; HYPRE_BigInt *P_row_starts, *A_col_starts; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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); } /* copy row starts since A will be destroyed */ A_col_starts = hypre_ParCSRBlockMatrixColStarts(A); #ifdef HYPRE_NO_GLOBAL_PARTITION P_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < 2; i++) { P_row_starts[i] = A_col_starts[i]; } #else P_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < num_procs + 1; i++) { P_row_starts[i] = A_col_starts[i]; } #endif /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm, block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, P_row_starts, 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_Int *col_offd_S_to_A, hypre_ParCSRBlockMatrix **P_ptr) { 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; /* 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_BigInt *P_row_starts, *A_col_starts; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] > 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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++; } } } else { 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); } /* copy row starts since A will be destroyed */ A_col_starts = hypre_ParCSRBlockMatrixColStarts(A); #ifdef HYPRE_NO_GLOBAL_PARTITION P_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < 2; i++) { P_row_starts[i] = A_col_starts[i]; } #else P_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); /* don't free this */ for (i = 0; i < num_procs + 1; i++) { P_row_starts[i] = A_col_starts[i]; } #endif /* Now create P - as a block matrix */ P = hypre_ParCSRBlockMatrixCreate(comm,block_size, hypre_ParCSRBlockMatrixGlobalNumRows(A), total_global_cpts, P_row_starts, 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_Int *col_offd_S_to_A, 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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.18.2/src/parcsr_block_mv/par_csr_block_matrix.c000066400000000000000000001220711355566575400232530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, HYPRE_BigInt *col_starts, 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, local_num_cols; HYPRE_BigInt first_row_index, first_col_diag; 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) { #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_num_rows, num_procs, my_id, &row_starts); #else hypre_GeneratePartitioning(global_num_rows,num_procs,&row_starts); #endif } if (!col_starts) { if (global_num_rows == global_num_cols) { col_starts = row_starts; } else { #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_num_cols, num_procs, my_id, &col_starts); #else hypre_GeneratePartitioning(global_num_cols,num_procs,&col_starts); #endif } } #ifdef HYPRE_NO_GLOBAL_PARTITION /* 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); #else first_row_index = row_starts[my_id]; local_num_rows = (HYPRE_Int)(row_starts[my_id+1]-first_row_index); first_col_diag = col_starts[my_id]; local_num_cols = (HYPRE_Int)(col_starts[my_id+1]-first_col_diag); #endif 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_ParCSRBlockMatrixColMapOffd(matrix) = NULL; hypre_ParCSRBlockMatrixAssumedPartition(matrix) = NULL; /* When NO_GLOBAL_PARTITION is set we could make these null, instead of leaving the range. If that change is made, then when this create is called from functions like the matrix-matrix multiply, be careful not to generate a new partition */ hypre_ParCSRBlockMatrixRowStarts(matrix) = row_starts; hypre_ParCSRBlockMatrixColStarts(matrix) = col_starts; hypre_ParCSRBlockMatrixCommPkg(matrix) = NULL; hypre_ParCSRBlockMatrixCommPkgT(matrix) = NULL; /* set defaults */ hypre_ParCSRBlockMatrixOwnsData(matrix) = 1; hypre_ParCSRBlockMatrixOwnsRowStarts(matrix) = 1; hypre_ParCSRBlockMatrixOwnsColStarts(matrix) = 1; if (row_starts == col_starts) hypre_ParCSRBlockMatrixOwnsColStarts(matrix) = 0; 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_ParCSRBlockMatrixOwnsRowStarts(matrix) ) hypre_TFree(hypre_ParCSRBlockMatrixRowStarts(matrix), HYPRE_MEMORY_HOST); if ( hypre_ParCSRBlockMatrixOwnsColStarts(matrix) ) hypre_TFree(hypre_ParCSRBlockMatrixColStarts(matrix), HYPRE_MEMORY_HOST); 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_ParCSRBlockMatrixSetRowStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixSetRowStartsOwner( hypre_ParCSRBlockMatrix *matrix, HYPRE_Int owns_row_starts ) { HYPRE_Int ierr=0; hypre_ParCSRBlockMatrixOwnsRowStarts(matrix) = owns_row_starts; return ierr; } /*-------------------------------------------------------------------------- * hypre_ParCSRBlockMatrixSetColStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRBlockMatrixSetColStartsOwner( hypre_ParCSRBlockMatrix *matrix, HYPRE_Int owns_col_starts ) { HYPRE_Int ierr=0; hypre_ParCSRBlockMatrixOwnsColStarts(matrix) = owns_col_starts; 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; HYPRE_BigInt *matrix_C_col_starts; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION matrix_C_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); matrix_C_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; } #else matrix_C_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); matrix_C_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for(i = 0; i < num_procs + 1; 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; } #endif 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; HYPRE_BigInt *matrix_C_col_starts; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION matrix_C_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); matrix_C_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; } #else matrix_C_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); matrix_C_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for(i = 0; i < num_procs + 1; 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; } #endif /************* 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) { #ifdef HYPRE_NO_GLOBAL_PARTITION 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; 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; } #else hypre_ParCSRCommPkg *comm_pkg; MPI_Comm comm = hypre_ParCSRBlockMatrixComm(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_BigInt *col_map_offd = hypre_ParCSRBlockMatrixColMapOffd(A); HYPRE_BigInt first_col_diag = hypre_ParCSRBlockMatrixFirstColDiag(A); HYPRE_BigInt *col_starts = hypre_ParCSRBlockMatrixColStarts(A); HYPRE_Int num_cols_diag = hypre_CSRBlockMatrixNumCols(hypre_ParCSRBlockMatrixDiag(A)); HYPRE_Int num_cols_offd = hypre_CSRBlockMatrixNumCols(hypre_ParCSRBlockMatrixOffd(A)); 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); #endif /*----------------------------------------------------------- * setup commpkg *----------------------------------------------------------*/ comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); 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; 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; 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; 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; 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; } tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(tmp_comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgSendProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgRecvProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = jdata_send_map_starts; 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]]; } hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = jdata_recv_vec_starts; 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; 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); 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); 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, i; HYPRE_BigInt global_size; HYPRE_BigInt *new_partitioning; /* 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) { #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_size, num_procs, my_id, &new_partitioning); #else hypre_GeneratePartitioning(global_size, num_procs, &new_partitioning); #endif } else /* adjust for block_size */ { #ifdef HYPRE_NO_GLOBAL_PARTITION new_partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for(i = 0; i < 2; i++) { new_partitioning[i] = p_partitioning[i]*(HYPRE_BigInt)block_size; } #else new_partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for(i = 0; i < num_procs + 1; i++) { new_partitioning[i] = p_partitioning[i]*(HYPRE_BigInt)block_size; } #endif } hypre_ParVectorComm(vector) = comm; hypre_ParVectorGlobalSize(vector) = global_size; #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_ParVectorFirstIndex(vector) = new_partitioning[0]; hypre_ParVectorLastIndex(vector) = new_partitioning[1]-1; hypre_ParVectorPartitioning(vector) = new_partitioning; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(new_partitioning[1]-new_partitioning[0]); #else hypre_ParVectorFirstIndex(vector) = new_partitioning[my_id]; hypre_ParVectorLastIndex(vector) = new_partitioning[my_id+1] -1; hypre_ParVectorPartitioning(vector) = new_partitioning; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(new_partitioning[my_id+1]-new_partitioning[my_id]); #endif /* set defaults */ hypre_ParVectorOwnsData(vector) = 1; hypre_ParVectorOwnsPartitioning(vector) = 1; return vector; } hypre-2.18.2/src/parcsr_block_mv/par_csr_block_matrix.h000066400000000000000000000345621355566575400232670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* array of length num_procs+1, row_starts[i] contains the global number of the first row on proc i, first_row_index = row_starts[my_id], row_starts[num_procs] = global_num_rows */ HYPRE_BigInt *col_starts; /* array of length num_procs+1, col_starts[i] contains the global number of the first column of diag on proc i, first_col_diag = col_starts[my_id], col_starts[num_procs] = global_num_cols */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRBlockMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Does the ParCSRBlockMatrix create/destroy `row_starts', `col_starts'? */ HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; 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_ParCSRBlockMatrixOwnsRowStarts(matrix) ((matrix) -> owns_row_starts) #define hypre_ParCSRBlockMatrixOwnsColStarts(matrix) ((matrix) -> owns_col_starts) #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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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.18.2/src/parcsr_block_mv/par_csr_block_matvec.c000066400000000000000000000205771355566575400232360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * 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; hypre_ParCSRCommPkg *comm_pkg; hypre_CSRBlockMatrix *diag, *offd; hypre_Vector *x_local, *y_local, *x_tmp; 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, *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.18.2/src/parcsr_block_mv/par_csr_block_rap.c000066400000000000000000002250471355566575400225400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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; 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]); tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(tmp_comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgSendProcs(tmp_comm_pkg) = recv_procs; hypre_ParCSRCommPkgRecvProcs(tmp_comm_pkg) = send_procs; 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]]; } hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = jdata_send_map_starts; hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = jdata_recv_vec_starts; 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; } hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; 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); 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; 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, *col_starts; hypre_ParCSRBlockMatrix *RAP; HYPRE_BigInt *col_map_offd_RAP; hypre_CSRBlockMatrix *RAP_int = NULL; HYPRE_Complex *RAP_int_data; HYPRE_Int *RAP_int_i; HYPRE_BigInt *RAP_int_j; hypre_CSRBlockMatrix *RAP_ext; HYPRE_Complex *RAP_ext_data; HYPRE_Int *RAP_ext_i; HYPRE_BigInt *RAP_ext_j; hypre_CSRBlockMatrix *RAP_diag; HYPRE_Complex *RAP_diag_data; HYPRE_Int *RAP_diag_i; HYPRE_Int *RAP_diag_j; hypre_CSRBlockMatrix *RAP_offd; HYPRE_Complex *RAP_offd_data; HYPRE_Int *RAP_offd_i; HYPRE_Int *RAP_offd_j; 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_Int first_col_diag_RAP; HYPRE_Int last_col_diag_RAP; HYPRE_Int num_cols_offd_RAP = 0; hypre_CSRBlockMatrix *R_diag; HYPRE_Complex *R_diag_data; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; hypre_CSRBlockMatrix *R_offd; HYPRE_Complex *R_offd_data; HYPRE_Int *R_offd_i; HYPRE_Int *R_offd_j; hypre_CSRBlockMatrix *Ps_ext; HYPRE_Complex *Ps_ext_data; HYPRE_Int *Ps_ext_i; HYPRE_BigInt *Ps_ext_j; HYPRE_Complex *P_ext_diag_data; HYPRE_Int *P_ext_diag_i; HYPRE_Int *P_ext_diag_j; HYPRE_Complex *P_ext_offd_data; HYPRE_Int *P_ext_offd_i; HYPRE_Int *P_ext_offd_j; HYPRE_BigInt *col_map_offd_Pext; HYPRE_Int *map_P_to_Pext; HYPRE_Int *map_P_to_RAP; HYPRE_Int *map_Pext_to_RAP; HYPRE_Int *P_marker; HYPRE_Int **P_mark_array; HYPRE_Int **A_mark_array; HYPRE_Int *A_marker; HYPRE_BigInt *temp = NULL; HYPRE_Int 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); } #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i = 0; i <= 1; i++) row_starts[i] = col_starts[i] = coarse_partitioning[i]; #else row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i <= num_procs; i++) row_starts[i] = col_starts[i] = coarse_partitioning[i]; #endif 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); } free(r_a_products); free(r_a_p_products); return(0); } hypre-2.18.2/src/parcsr_block_mv/par_csr_block_rap_communication.c000066400000000000000000000161261355566575400254610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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 ierr = 0; 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 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION /* all processors are needed for these routines */ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A_ParCSR); f_vector = hypre_ParVectorToVectorAll(f); #endif if (n) { #ifndef HYPRE_NO_GLOBAL_PARTITION A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A_ParCSR); f_vector = hypre_ParVectorToVectorAll(f); #endif 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION else { hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } #endif 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 (fabs(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 (fabs(A[j*n+k]) > fabs(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 (fabs(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 ( fabs(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.18.2/src/parcsr_ls/000077500000000000000000000000001355566575400155375ustar00rootroot00000000000000hypre-2.18.2/src/parcsr_ls/CMakeLists.txt000066400000000000000000000044301355566575400203000ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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_ams.c gen_redcs_mat.c HYPRE_parcsr_amg.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_ParaSails.c HYPRE_parcsr_pcg.c HYPRE_parcsr_pilut.c HYPRE_parcsr_schwarz.c HYPRE_ams.c HYPRE_ads.c HYPRE_ame.c par_amg.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_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_multi_interp.c par_laplace_27pt.c par_laplace_9pt.c par_laplace.c par_lr_interp.c par_mgr.c par_mgr_setup.c par_mgr_solve.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_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 pcg_par.c schwarz.c block_tridiag.c ams.c ads.c ame.c par_restr.c par_lr_restr.c ) if (HYPRE_USING_DSUPERLU) list(APPEND SRCS superlu.c) endif() convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/parcsr_ls/Common.h000066400000000000000000000026231355566575400171430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_ams.c000066400000000000000000000307401355566575400200540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_Euclid.c000066400000000000000000000157041355566575400220560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_ParaSails.c000066400000000000000000000224631355566575400225300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_amg.c000066400000000000000000002115131355566575400214110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_BoomerAMGSetSCommPkgSwitch *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_boomeramgsetscommpkgswitc, HYPRE_BOOMERAMGSETSCOMMPKGSWITC) ( hypre_F90_Obj *solver, hypre_F90_Real *S_commpkg_switch, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_BoomerAMGSetSCommPkgSwitch( hypre_F90_PassObj (HYPRE_Solver, solver), hypre_F90_PassReal (S_commpkg_switch) ) ); } /*-------------------------------------------------------------------------- * 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_bicgstab.c000066400000000000000000000251041355566575400224220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_block.c000066400000000000000000000125061355566575400217400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_cgnr.c000066400000000000000000000227301355566575400215770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_cogmres.c000066400000000000000000000270401355566575400223040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_flexgmres.c000066400000000000000000000252371355566575400226470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_gmres.c000066400000000000000000000256601355566575400217700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_hybrid.c000066400000000000000000000713161355566575400221330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *---------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_int.c000066400000000000000000000114211355566575400214330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_lgmres.c000066400000000000000000000247361355566575400221470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_pcg.c000066400000000000000000000301451355566575400214160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_pilut.c000066400000000000000000000107201355566575400217770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_HYPRE_parcsr_schwarz.c000066400000000000000000000143761355566575400223360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/F90_hypre_laplace.c000066400000000000000000000033171355566575400211350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/HYPRE_ads.c000066400000000000000000000243661355566575400174340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int 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.18.2/src/parcsr_ls/HYPRE_ame.c000066400000000000000000000113061355566575400174150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/parcsr_ls/HYPRE_ams.c000066400000000000000000000375731355566575400174510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int 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.18.2/src/parcsr_ls/HYPRE_parcsr_Euclid.c000066400000000000000000000351341355566575400214370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "../utilities/mpistubs.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_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_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 ) { #ifdef HYPRE_MIXEDINT 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 ) { #ifdef HYPRE_MIXEDINT 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[] ) { #ifdef HYPRE_MIXEDINT 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 ) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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) { #ifdef HYPRE_MIXEDINT 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.18.2/src/parcsr_ls/HYPRE_parcsr_ParaSails.c000066400000000000000000000544671355566575400221230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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); free(secret); 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 ) { #ifdef HYPRE_MIXEDINT 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 ) { #ifdef HYPRE_MIXEDINT 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_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_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_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_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_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_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_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_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_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_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); free(secret); 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 ) { #ifdef HYPRE_MIXEDINT 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 ) { #ifdef HYPRE_MIXEDINT 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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.18.2/src/parcsr_ls/HYPRE_parcsr_amg.c000066400000000000000000002016621355566575400207770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 ) { 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 ) { 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 ) { 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_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 ) { return( hypre_BoomerAMGSetSCommPkgSwitch( (void *) solver, S_commpkg_switch ) ); } /*-------------------------------------------------------------------------- * 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_BoomerAMGSetNumFunctions, HYPRE_BoomerAMGGetNumFunctions *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_BoomerAMGSetNumFunctions( HYPRE_Solver solver, HYPRE_Int num_functions ) { return( hypre_BoomerAMGSetNumFunctions( (void *) solver, num_functions ) ); } HYPRE_Int HYPRE_BoomerAMGGetNumFunctions( HYPRE_Solver solver, HYPRE_Int * num_functions ) { return( hypre_BoomerAMGGetNumFunctions( (void *) solver, num_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_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_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_Int HYPRE_BoomerAMGSetCpointsToKeep(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_Int *cpt_coarse_index) { return (hypre_BoomerAMGSetCpointsToKeep( (void *) solver, cpt_coarse_level, num_cpt_coarse, cpt_coarse_index)); } hypre-2.18.2/src/parcsr_ls/HYPRE_parcsr_bicgstab.c000066400000000000000000000173431355566575400220120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/parcsr_ls/HYPRE_parcsr_block.c000066400000000000000000000076331355566575400213270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/HYPRE_parcsr_cgnr.c000066400000000000000000000147711355566575400211670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/parcsr_ls/HYPRE_parcsr_cogmres.c000066400000000000000000000207341355566575400216710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_COGMRESFunctions * cogmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } cogmres_functions = hypre_COGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/parcsr_ls/HYPRE_parcsr_flexgmres.c000066400000000000000000000205021355566575400222170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_FlexGMRESFunctions * fgmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/parcsr_ls/HYPRE_parcsr_gmres.c000066400000000000000000000234171355566575400213500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_GMRESFunctions * gmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } gmres_functions = hypre_GMRESFunctionsCreate( hypre_CAlloc, 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_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_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.18.2/src/parcsr_ls/HYPRE_parcsr_hybrid.c000066400000000000000000000601711355566575400215120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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-2.18.2/src/parcsr_ls/HYPRE_parcsr_int.c000066400000000000000000000114241355566575400210200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_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) { 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.18.2/src/parcsr_ls/HYPRE_parcsr_lgmres.c000066400000000000000000000176641355566575400215330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_LGMRESFunctions * lgmres_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/parcsr_ls/HYPRE_parcsr_ls.h000066400000000000000000004364621355566575400206660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR Solvers * * These solvers use matrix/vector storage schemes that are taylored * for general sparse matrix systems. * * @memo Linear solvers for sparse matrix systems **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name ParCSR Solvers **/ /*@{*/ struct hypre_Solver_struct; /** * The solver object. **/ #ifndef HYPRE_SOLVER_STRUCT #define HYPRE_SOLVER_STRUCT struct hypre_Solver_struct; typedef struct hypre_Solver_struct *HYPRE_Solver; #endif 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 {\tt 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 {\tt 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 $A^T x = b$ 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 {\tt 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 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 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-7. **/ 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 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. The * strong threshold for R is strong connections used in building an * approximate ideal restriction, and the filter threshold for R a * threshold to eliminate small entries from R after building it. **/ HYPRE_Int HYPRE_BoomerAMGSetStrongThreshold(HYPRE_Solver solver, HYPRE_Real strong_threshold); HYPRE_Int HYPRE_BoomerAMGSetStrongThresholdR(HYPRE_Solver solver, HYPRE_Real strong_threshold); HYPRE_Int HYPRE_BoomerAMGSetFilterThresholdR(HYPRE_Solver solver, HYPRE_Real filter_threshold); /** * (Optional) Defines the largest strength threshold for which * the strength matrix S uses the communication package of the operator A. * If the strength threshold is larger than this values, * a communication package is generated for S. This can save * memory and decrease the amount of data that needs to be communicated, * if S is substantially sparser than A. * The default is 1.0. **/ 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 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 coarsen\_type: * * \begin{tabular}{|c|l|} \hline * 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 \\ * \hline * \end{tabular} * * 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. * \begin{tabular}{|c|l|} \hline * 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 \\ * \hline * \end{tabular} **/ 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) Defines which parallel interpolation operator is used. * There are the following options for interp\_type: * * \begin{tabular}{|c|l|} \hline * 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) \\ * 4 & multipass interpolation \\ * 5 & multipass interpolation (with separation of weights) \\ * 6 & extended+i interpolation \\ * 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 \\ * \hline * \end{tabular} * * 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: * * \begin{tabular}{|c|l|} \hline * 1 & 2-stage extended+i interpolation \\ * 2 & 2-stage standard interpolation \\ * 3 & 2-stage extended interpolation \\ * 4 & multipass interpolation \\ * \hline * \end{tabular} **/ 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: * \begin{tabular}{|c|l|} \hline * 1 & GM approach 1 \\ * 2 & GM approach 2 (to be preferred over 1) \\ * 3 & LN approach \\ * \hline * \end{tabular} **/ 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 cycle\_type to 1, for a W-cycle * set 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 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 k: * * \begin{tabular}{|l|l|} \hline * the down cycle & if k=1 \\ * the up cycle & if k=2 \\ * the coarsest level & if k=3.\\ * \hline * \end{tabular} **/ 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 $\ell_1$-Gauss-Seidel, forward solve (13) * on the down cycle and backward solve (14) on the up cycle. * * There are the following options for relax\_type: * * \begin{tabular}{|c|l|} \hline * 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 \\ * 8 & $\ell_1$-scaled hybrid symmetric Gauss-Seidel\\ * 9 & Gaussian elimination (only on coarsest level) \\ * 13 & $\ell_1$ Gauss-Seidel, forward solve \\ * 14 & $\ell_1$ Gauss-Seidel, backward solve \\ * 15 & CG (warning - not a fixed smoother - may require FGMRES)\\ * 16 & Chebyshev\\ * 17 & FCF-Jacobi\\ * 18 & $\ell_1$-scaled jacobi\\ * \hline * \end{tabular} **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type); /** * (Optional) Defines the smoother at a given cycle. * For options of relax\_type see * description of HYPRE\_BoomerAMGSetRelaxType). Options for k are * * \begin{tabular}{|l|l|} \hline * the down cycle & if k=1 \\ * the up cycle & if k=2 \\ * the coarsest level & if k=3. \\ * \hline * \end{tabular} **/ 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 * relax\_order: * * \begin{tabular}{|c|l|} \hline * 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. \\ * \hline * \end{tabular} * * The default is 0. **/ HYPRE_Int HYPRE_BoomerAMGSetRelaxOrder(HYPRE_Solver solver, HYPRE_Int relax_order); /* * (Optional) Defines in which order the points are relaxed. * * Note: This routine will be phased out!!!! * Use HYPRE\_BoomerAMGSetRelaxOrder instead. **/ 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. * * \begin{tabular}{|l|l|} \hline * relax\_weight > 0 & this assigns the given relaxation weight on all levels \\ * relax\_weight = 0 & the weight is determined on each level * with the estimate $3 \over {4\|D^{-1/2}AD^{-1/2}\|}$,\\ * & where $D$ is the diagonal matrix of $A$ (this should only be used with Jacobi) \\ * relax\_weight = -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) \\ * \hline * \end{tabular} * * 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 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. * * \begin{tabular}{|l|l|} \hline * omega > 0 & this assigns the same outer relaxation weight omega on each level\\ * omega = -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, e.g. SSOR) \\ * \hline * \end{tabular} * * 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 smooth\_type: * * \begin{tabular}{|c|l|l|} \hline * value & smoother & routines needed to set smoother parameters \\ * 6 & Schwarz smoothers & HYPRE\_BoomerAMGSetDomainType, HYPRE\_BoomerAMGSetOverlap, \\ * & & HYPRE\_BoomerAMGSetVariant, HYPRE\_BoomerAMGSetSchwarzRlxWeight \\ * 7 & Pilut & HYPRE\_BoomerAMGSetDropTol, HYPRE\_BoomerAMGSetMaxNzPerRow \\ * 8 & ParaSails & HYPRE\_BoomerAMGSetSym, HYPRE\_BoomerAMGSetLevel, \\ * & & HYPRE\_BoomerAMGSetFilter, HYPRE\_BoomerAMGSetThreshold \\ * 9 & Euclid & HYPRE\_BoomerAMGSetEuclidFile \\ * \hline * \end{tabular} * * 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 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 variant: * * \begin{tabular}{|c|l|} \hline * 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) \\ * \hline * \end{tabular} * * 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: * * \begin{tabular}{|c|l|} \hline * 0 & no overlap \\ * 1 & minimal overlap (default) \\ * 2 & overlap generated by including all neighbors of domain boundaries \\ * \hline * \end{tabular} **/ 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 domain\_type: * * \begin{tabular}{|c|l|} \hline * 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) \\ * \hline * \end{tabular} **/ 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 use\_nonsymm: * * \begin{tabular}{|c|l|} \hline * 0 & assume SPD (default) \\ * 1 & assume non-symmetric \\ * \hline * \end{tabular} **/ 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); /** * (Optional) Defines which parallel restriction operator is used. * There are the following options for restr\_type: * * \begin{tabular}{|c|l|} \hline * 0 & $P^T$ - Transpose of the interpolation operator \\ * 1 & AIR-1 - Approximate Ideal Restriction (distance 1) \\ * 2 & AIR-2 - Approximate Ideal Restriction (distance 2) \\ * \hline * \end{tabular} * * 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 ); /* 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. * * \begin{tabular}{|c|l|} \hline * 0 & no printout (default) \\ * 1 & print setup information \\ * 2 & print solve information \\ * 3 & print both setup and solve information \\ * \hline * \end{tabular} * * Note, that if one desires to print information and uses BoomerAMG as a * preconditioner, suggested print$\_$level is 1 to avoid excessive output, * and use 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 for 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. **/ 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 **/ 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 **/ 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); #ifdef HYPRE_USING_DSUPERLU /* * HYPRE_BoomerAMGSetDSLUThreshold **/ 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_BoomerAMGSetCpointsToKeep(HYPRE_Solver solver, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_Int *cpt_coarse_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 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 {\tt 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 {\tt 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, $0 \le$ thresh $\le 1$. * The default value is 0.1. * @param nlevels [IN] Value of levels parameter, $0 \le$ 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. * * \begin{tabular}{|c|l|} \hline * value & meaning \\ \hline * 0 & nonsymmetric and/or indefinite problem, and nonsymmetric preconditioner\\ * 1 & SPD problem, and SPD (factored) preconditioner \\ * 2 & nonsymmetric, definite problem, and SPD (factored) preconditioner \\ * \hline * \end{tabular} * * @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, * $0 \le$ loadbal $\le 1$. 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: * \begin{center} * \begin{tabular}{|l|c|l|} * \hline * Option & Default & Synopsis \\ * \hline * -level & 1 & ILU($k$) factorization level \\ \hline * -bj & 0 (false) & Use Block Jacobi ILU instead of PILU \\ \hline * -eu\_stats & 0 (false) & Print internal timing and statistics \\ \hline * -eu\_mem & 0 (false) & Print internal memory usage \\ \hline * \end{tabular} * \end{center} * **/ /*@{*/ /** * 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 {\tt 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 {\tt 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: \\ * * >cat optionsFile \\ * \#sample runtime parameter file \\ * -blockJacobi 3 \\ * -matFile /home/hysom/myfile.euclid \\ * -doSomething true \\ * -xx\_coeff -1.0 * * 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 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 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 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt 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 {\tt 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 $G$. * This function should be called before HYPRE\_AMSSetup()! **/ HYPRE_Int HYPRE_AMSSetDiscreteGradient(HYPRE_Solver solver, HYPRE_ParCSRMatrix G); /** * Sets the $x$, $y$ and $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 $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 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 * $\Pi = [ \Pi^x, \Pi^y, \Pi^z ]$. * * 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 $\Pi^x \varphi = \Pi * (\varphi,0,0)$ and similarly for $\Pi^y$ and $\Pi^z$. 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 $\{\Pi^x,\Pi^y,\Pi^z\}$ 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(HYPRE_Solver solver, HYPRE_ParCSRMatrix Pi, HYPRE_ParCSRMatrix Pix, HYPRE_ParCSRMatrix Piy, HYPRE_ParCSRMatrix Piz); /** * (Optional) Sets the matrix $A_\alpha$ 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(). See the user's manual for more details. **/ HYPRE_Int HYPRE_AMSSetAlphaPoissonMatrix(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_alpha); /** * (Optional) Sets the matrix $A_\beta$ corresponding to the Poisson * problem with coefficient $\beta$ (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 $\beta$ 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 $10^{-6}$. **/ HYPRE_Int HYPRE_AMSSetTol(HYPRE_Solver solver, HYPRE_Real tol); /** * (Optional) Choose which three-level solver to use. Possible values are: * * \begin{tabular}{|c|l|} * \hline * 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) \\ * \hline * \end{tabular} * * 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 $A$. * The defaults are $2$, $1$, $1.0$, $1.0$. * * The available options for relax\_type are: * * \begin{tabular}{|c|l|} \hline * 1 & $\ell_1$-scaled Jacobi \\ * 2 & $\ell_1$-scaled block symmetric Gauss-Seidel/SSOR \\ * 3 & Kaczmarz \\ * 4 & truncated version of $\ell_1$-scaled block symmetric Gauss-Seidel/SSOR \\ * 16 & Chebyshev \\ * \hline * \end{tabular} **/ 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 $B_\Pi$. * 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 $B_\Pi$. * 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 $B_G$. * 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 $B_G$. * 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: $x = (I - G_0 (G_0^t G_0)^{-1} G_0^T) x$, where $G_0$ 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 $G_0$. * * 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 edge\_vertex lists the edge * vertices consecutively, and that the orientation of all edges is consistent. * * 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt 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 {\tt 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 $C$. * This function should be called before HYPRE\_ADSSetup()! **/ HYPRE_Int HYPRE_ADSSetDiscreteCurl(HYPRE_Solver solver , HYPRE_ParCSRMatrix C); /** * Sets the discrete gradient matrix $G$. * This function should be called before HYPRE\_ADSSetup()! **/ HYPRE_Int HYPRE_ADSSetDiscreteGradient(HYPRE_Solver solver , HYPRE_ParCSRMatrix G); /** * Sets the $x$, $y$ and $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 ($\Pi_{RT}$) and the Nedelec * ($\Pi_{ND}$) 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 $\Pi_{RT}$ and $\Pi_{ND}$ 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 $\Pi^x \varphi = * \Pi (\varphi,0,0)$ and similarly for $\Pi^y$ and $\Pi^z$. 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 * $\{\Pi_{RT}\}$ and $\{\Pi_{RT}^x,\Pi_{RT}^y,\Pi_{RT}^z\}$ 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 * $\{\Pi_{ND}\}$ and $\{\Pi_{ND}^x,\Pi_{ND}^y,\Pi_{ND}^z\}$ -- 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 $10^{-6}$. **/ HYPRE_Int HYPRE_ADSSetTol(HYPRE_Solver solver , HYPRE_Real tol); /** * (Optional) Choose which auxiliary-space solver to use. Possible values are: * * \begin{tabular}{|c|l|} * \hline * 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) \\ * \hline * \end{tabular} * * 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 $A$. * The defaults are $2$, $1$, $1.0$, $1.0$. * * The available options for relax\_type are: * * \begin{tabular}{|c|l|} \hline * 1 & $\ell_1$-scaled Jacobi \\ * 2 & $\ell_1$-scaled block symmetric Gauss-Seidel/SSOR \\ * 3 & Kaczmarz \\ * 4 & truncated version of $\ell_1$-scaled block symmetric Gauss-Seidel/SSOR \\ * 16 & Chebyshev \\ * \hline * \end{tabular} **/ 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_Int cheby_fraction); /** * (Optional) Sets AMS parameters for $B_C$. * The defaults are $11$, $10$, $1$, $3$, $0.25$, $0$, $0$. * Note that 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 $B_\Pi$. * 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{PCG Solver}. **/ /*@{*/ /** * 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_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{GMRES Solver}. **/ /*@{*/ /** * 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{FlexGMRES Solver}. **/ /*@{*/ /** * 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{LGMRES Solver}. **/ /*@{*/ /** * 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{BiCGSTAB Solver}. **/ /*@{*/ /** * 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-7. **/ 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: * \begin{tabular}{l l} * 1 & PCG (default) \\ * 2 & GMRES \\ * 3 & BiCGSTAB * \end{tabular} **/ 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 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 coarsen\_type: * * \begin{tabular}{|c|l|} \hline * 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 \\ * \hline * \end{tabular} * * 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 cycle\_type to 1, for a W-cycle * set 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 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 k: * * \begin{tabular}{|l|l|} \hline * the down cycle & if k=1 \\ * the up cycle & if k=2 \\ * the coarsest level & if k=3.\\ * \hline * \end{tabular} **/ 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 relax\_type: * * \begin{tabular}{|c|l|} \hline * 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) \\ * \hline * \end{tabular} **/ HYPRE_Int HYPRE_ParCSRHybridSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type); /** * (Optional) Defines the smoother at a given cycle. * For options of relax\_type see * description of HYPRE\_BoomerAMGSetRelaxType). Options for k are * * \begin{tabular}{|l|l|} \hline * the down cycle & if k=1 \\ * the up cycle & if k=2 \\ * the coarsest level & if k=3. \\ * \hline * \end{tabular} **/ 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 * relax\_order: * * \begin{tabular}{|c|l|} \hline * 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. \\ * \hline * \end{tabular} * * 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. * * \begin{tabular}{|l|l|} \hline * relax\_weight > 0 & this assigns the given relaxation weight on all levels \\ * relax\_weight = 0 & the weight is determined on each level * with the estimate $3 \over {4\|D^{-1/2}AD^{-1/2}\|}$,\\ * & where $D$ is the diagonal matrix of $A$ (this should only be used with Jacobi) \\ * relax\_weight = -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) \\ * \hline * \end{tabular} * * 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 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. * * \begin{tabular}{|l|l|} \hline * omega > 0 & this assigns the same outer relaxation weight omega on each level\\ * omega = -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, e.g. SSOR) \\ * \hline * \end{tabular} * * 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 degree of aggressive coarsening. * The default is 1, which leads to the most aggressive coarsening. * Setting 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* * @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. **/ /*@{*/ /** * Create a solver object **/ HYPRE_Int HYPRE_MGRCreate( HYPRE_Solver *solver ); /*-------------------------------------------------------------------------- * HYPRE_MGRDestroy *--------------------------------------------------------------------------*/ /** * Destroy a solver object **/ HYPRE_Int HYPRE_MGRDestroy( HYPRE_Solver solver ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetup *--------------------------------------------------------------------------*/ /** * Setup the MGR solver or preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver {\tt 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 ); /*-------------------------------------------------------------------------- * HYPRE_MGRSolve *--------------------------------------------------------------------------*/ /** * Solve the system or apply MGR as a preconditioner. * If used as a preconditioner, this function should be passed * to the iterative solver {\tt 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 ); /*-------------------------------------------------------------------------- * HYPRE_Int HYPRE_MGRSetCpointsByBlock *--------------------------------------------------------------------------*/ /** * Set the block data 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); /** * (Optional) Set non C-points to F-points. * This routine determines how the coarse points are selected for the next level * reduction. Options for {\tt nonCptToFptFlag} are: * * \begin{tabular}{|c|l|} \hline * 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 \\ * \hline * \end{tabular} * **/ HYPRE_Int HYPRE_MGRSetNonCpointsToFpoints( HYPRE_Solver solver, HYPRE_Int nonCptToFptFlag); /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxCoarseLevels *--------------------------------------------------------------------------*/ /** * (Optional) Set maximum number of coarsening (or reduction) levels. * The default is 10. **/ HYPRE_Int HYPRE_MGRSetMaxCoarseLevels( HYPRE_Solver solver, HYPRE_Int maxlev ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetBlockSize *--------------------------------------------------------------------------*/ /** * (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 ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCoarseNodes *--------------------------------------------------------------------------*/ /** * (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_Int *reserved_coarse_nodes ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxType *--------------------------------------------------------------------------*/ /** * (Optional) Set the relaxation type for F-relaxation. * Currently supports the following flavors of relaxation types * as described in the {\tt BoomerAMGSetRelaxType}: * relax\_types 0 - 8, 13, 14, 18, 19, 98. **/ HYPRE_Int HYPRE_MGRSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxMethod *--------------------------------------------------------------------------*/ /** * (Optional) Set the strategy for F-relaxation. * Options for {\tt relax\_method} are: * * \begin{tabular}{|c|l|} \hline * 0 & Single-level relaxation sweeps for F-relaxation as prescribed by {\tt MGRSetRelaxType} \\ * 1 & Multi-level relaxation strategy for F-relaxation (V(1,0) cycle currently supported). \\ * \hline * \end{tabular} **/ HYPRE_Int HYPRE_MGRSetFRelaxMethod(HYPRE_Solver solver, HYPRE_Int relax_method ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetRestrictType *--------------------------------------------------------------------------*/ /** * (Optional) Set the strategy for computing the MGR restriction operator. * * Options for {\tt restrict\_type} are: * * \begin{tabular}{|c|l|} \hline * 0 & injection $[0 I]$ \\ * 1 & unscaled (not recommended) \\ * 2 & diagonal scaling (Jacobi) \\ * else & use classical modified interpolation \\ * \hline * \end{tabular} * * These options are currently active for the last stage reduction. Intermediate * reduction levels use injection. The default is injection. **/ HYPRE_Int HYPRE_MGRSetRestrictType( HYPRE_Solver solver, HYPRE_Int restrict_type); /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRestrictSweeps *--------------------------------------------------------------------------*/ /** * (Optional) Set number of restriction sweeps. * This option is for restrict\_type > 2. **/ HYPRE_Int HYPRE_MGRSetNumRestrictSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetInterpType *--------------------------------------------------------------------------*/ /** * (Optional) Set the strategy for computing the MGR restriction operator. * Options for {\tt interp\_type} are: * * \begin{tabular}{|c|l|} \hline * 0 & injection $[0 I]^{T}$ \\ * 1 & unscaled (not recommended) \\ * 2 & diagonal scaling (Jacobi) \\ * else & use default (classical modified interpolation) \\ * \hline * \end{tabular} * * These options are currently active for the last stage reduction. Intermediate * reduction levels use diagonal scaling. **/ HYPRE_Int HYPRE_MGRSetInterpType( HYPRE_Solver solver, HYPRE_Int interp_type ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRelaxSweeps *--------------------------------------------------------------------------*/ /** * (Optional) Set number of relaxation sweeps. * This option is for the `single level' F-relaxation (relax\_method = 0). **/ HYPRE_Int HYPRE_MGRSetNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumInterpSweeps *--------------------------------------------------------------------------*/ /** * (Optional) Set number of interpolation sweeps. * This option is for interp\_type > 2. **/ HYPRE_Int HYPRE_MGRSetNumInterpSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetCoarseSolver *--------------------------------------------------------------------------*/ /** * (Optional) Set the coarse grid solver. * Currently uses BoomerAMG. * The default, if not set, is BoomerAMG with default options. * * @param solver [IN] solver or 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] BoomerAMG solver **/ HYPRE_Int HYPRE_MGRSetCoarseSolver(HYPRE_Solver solver, HYPRE_PtrToParSolverFcn coarse_grid_solver_solve, HYPRE_PtrToParSolverFcn coarse_grid_solver_setup, HYPRE_Solver coarse_grid_solver ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetPrintLevel *--------------------------------------------------------------------------*/ /** * (Optional) Set the print level to print setup and solve information. * * \begin{tabular}{|c|l|} \hline * 0 & no printout (default) \\ * 1 & print setup information \\ * 2 & print solve information \\ * 3 & print both setup and solve information \\ * \hline * \end{tabular} **/ HYPRE_Int HYPRE_MGRSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetLogging *--------------------------------------------------------------------------*/ /** * (Optional) Requests logging of solver diagnostics. * Requests additional computations for diagnostic and similar * data to be logged by the user. Default to 0 for do nothing. The latest * residual will be available if logging > 1. **/ HYPRE_Int HYPRE_MGRSetLogging( HYPRE_Solver solver, HYPRE_Int logging ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxIter *--------------------------------------------------------------------------*/ /** * (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 ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetTol *--------------------------------------------------------------------------*/ /** * (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-7. **/ HYPRE_Int HYPRE_MGRSetTol( HYPRE_Solver solver, HYPRE_Real tol ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxGlobalsmoothIters *--------------------------------------------------------------------------*/ /** * (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 ); /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalsmoothType *--------------------------------------------------------------------------*/ /** * (Optional) Determines type of global smoother. * Options for {\tt smooth\_type} are: * * \begin{tabular}{|c|l|} \hline * 0 & block Jacobi (default) \\ * 1 & Jacobi \\ * 2 & Gauss-Seidel, sequential (very slow!) \\ * 3 & Gauss-Seidel, interior points in parallel, boundary sequential (slow!) \\ * 4 & hybrid Gauss-Seidel or SOR, forward solve \\ * 5 & hybrid Gauss-Seidel or SOR, backward solve \\ * 6 & hybrid chaotic Gauss-Seidel (works only with OpenMP) \\ * 7 & hybrid symmetric Gauss-Seidel or SSOR \\ * 8 & Euclid (ILU) \\ * \hline * \end{tabular} **/ HYPRE_Int HYPRE_MGRSetGlobalsmoothType( HYPRE_Solver solver, HYPRE_Int smooth_type ); /*-------------------------------------------------------------------------- * HYPRE_MGRGetNumIterations *--------------------------------------------------------------------------*/ /** * (Optional) Return the number of MGR iterations. **/ HYPRE_Int HYPRE_MGRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ); /*-------------------------------------------------------------------------- * HYPRE_MGRGetResidualNorm *--------------------------------------------------------------------------*/ /** * (Optional) Return the norm of the final relative residual. **/ HYPRE_Int HYPRE_MGRGetFinalRelativeResidualNorm( 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* 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); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* These includes shouldn't be here. (RDF) */ #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" /** * @name ParCSR LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \Ref{LOBPCG Eigensolver}. **/ /*@{*/ /** * 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); /* The next routines should not be here (lower-case prefix). (RDF) */ /* * 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.18.2/src/parcsr_ls/HYPRE_parcsr_mgr.c000066400000000000000000000226301355566575400210140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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(2); 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 ) { 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 ) { return( hypre_MGRSolve( (void *) solver, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) b, (hypre_ParVector *) x ) ); } /*-------------------------------------------------------------------------- * 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_Int HYPRE_MGRSetNonCpointsToFpoints( HYPRE_Solver solver, HYPRE_Int nonCptToFptFlag) { return hypre_MGRSetNonCpointsToFpoints((void *) solver, nonCptToFptFlag); } /*-------------------------------------------------------------------------- * 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 ) { 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_MGRSetMaxLevels *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxCoarseLevels( HYPRE_Solver solver, HYPRE_Int maxlev ) { return hypre_MGRSetMaxCoarseLevels(solver, maxlev); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetBlockSize *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetBlockSize( HYPRE_Solver solver, HYPRE_Int bsize ) { return hypre_MGRSetBlockSize(solver, bsize ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetReservedCoarseNodes *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetReservedCoarseNodes( HYPRE_Solver solver, HYPRE_Int reserved_coarse_size, HYPRE_Int *reserved_coarse_indexes ) { return hypre_MGRSetReservedCoarseNodes(solver, reserved_coarse_size, reserved_coarse_indexes ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRestrictType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetRestrictType(HYPRE_Solver solver, HYPRE_Int restrict_type ) { return hypre_MGRSetRestrictType(solver, restrict_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxMethod *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetFRelaxMethod(HYPRE_Solver solver, HYPRE_Int relax_method ) { return hypre_MGRSetFRelaxMethod(solver, relax_method ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetRelaxType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetRelaxType(HYPRE_Solver solver, HYPRE_Int relax_type ) { return hypre_MGRSetRelaxType(solver, relax_type ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRelaxSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumRelaxSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { return hypre_MGRSetNumRelaxSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetInterpType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetInterpType( HYPRE_Solver solver, HYPRE_Int interpType ) { return hypre_MGRSetInterpType(solver, interpType); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumInterpSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumInterpSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { return hypre_MGRSetNumInterpSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetNumRestrictSweeps *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetNumRestrictSweeps( HYPRE_Solver solver, HYPRE_Int nsweeps ) { return hypre_MGRSetNumRestrictSweeps(solver, nsweeps); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetPrintLevel *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetPrintLevel( HYPRE_Solver solver, HYPRE_Int print_level ) { return hypre_MGRSetPrintLevel( solver, print_level ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetLogging *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetLogging( HYPRE_Solver solver, HYPRE_Int logging ) { return hypre_MGRSetLogging(solver, logging ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxIter *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) { return hypre_MGRSetMaxIter( solver, max_iter ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetTol *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetTol( HYPRE_Solver solver, HYPRE_Real tol ) { return hypre_MGRSetTol( solver, tol ); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetMaxGlobalsmoothIters *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetMaxGlobalsmoothIters( HYPRE_Solver solver, HYPRE_Int max_iter ) { return hypre_MGRSetMaxGlobalsmoothIters(solver, max_iter); } /*-------------------------------------------------------------------------- * HYPRE_MGRSetGlobalsmoothType *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRSetGlobalsmoothType( HYPRE_Solver solver, HYPRE_Int iter_type ) { return hypre_MGRSetGlobalsmoothType(solver, iter_type); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetNumIterations *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRGetNumIterations( HYPRE_Solver solver, HYPRE_Int *num_iterations ) { return hypre_MGRGetNumIterations( solver, num_iterations ); } /*-------------------------------------------------------------------------- * HYPRE_MGRGetFinalRelativeResidualNorm *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_MGRGetFinalRelativeResidualNorm( HYPRE_Solver solver, HYPRE_Real *res_norm ) { return hypre_MGRGetFinalRelativeResidualNorm(solver, res_norm); } hypre-2.18.2/src/parcsr_ls/HYPRE_parcsr_ml.cpp000066400000000000000000001065621355566575400212060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_ParCSRML interface */ /*--------------------------------------------------------------------------*/ /* local functions : * * MH_Irecv * MH_Send * MH_Wait * MH_ExchBdry * MH_MatVec * MH_GetRow * HYPRE_ParCSRMLCreate * HYPRE_ParCSRMLDestroy * HYPRE_ParCSRMLSetup * HYPRE_ParCSRMLSolve * HYPRE_ParCSRMLSetStrongThreshold * HYPRE_ParCSRMLSetNumPreSmoothings * HYPRE_ParCSRMLSetNumPostSmoothings * HYPRE_ParCSRMLSetPreSmoother * HYPRE_ParCSRMLSetPostSmoother * HYPRE_ParCSRMLSetDampingFactor * HYPRE_ParCSRMLConstructMHMatrix ****************************************************************************/ #include #include #include #include #include "./HYPRE_parcsr_ls.h" #include "../utilities/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/par_vector.h" #ifdef MLPACK #include "../../ML/ml/src/ml_struct.h" #include "../../ML/ml/src/ml_aggregate.h" extern void qsort0(HYPRE_Int *, HYPRE_Int, HYPRE_Int); /****************************************************************************/ /* local data structures */ /*--------------------------------------------------------------------------*/ typedef struct { HYPRE_Int Nrows; HYPRE_Int *rowptr; HYPRE_Int *colnum; HYPRE_Int *map; HYPRE_Real *values; HYPRE_Int sendProcCnt; HYPRE_Int *sendProc; HYPRE_Int *sendLeng; HYPRE_Int **sendList; HYPRE_Int recvProcCnt; HYPRE_Int *recvProc; HYPRE_Int *recvLeng; } MH_Matrix; typedef struct { MH_Matrix *Amat; MPI_Comm comm; HYPRE_Int globalEqns; HYPRE_Int *partition; } MH_Context; typedef struct { MPI_Comm comm; ML *ml_ptr; HYPRE_Int nlevels; HYPRE_Int pre, post; HYPRE_Int pre_sweeps, post_sweeps; HYPRE_Int BGS_blocksize; HYPRE_Real jacobi_wt; HYPRE_Real ag_threshold; ML_Aggregate *ml_ag; MH_Context *contxt; } MH_Link; extern HYPRE_Int HYPRE_ParCSRMLConstructMHMatrix(HYPRE_ParCSRMatrix, MH_Matrix *, MPI_Comm, HYPRE_Int *,MH_Context*); /****************************************************************************/ /* communication functions on parallel platforms */ /*--------------------------------------------------------------------------*/ HYPRE_Int MH_Irecv(void* buf, hypre_uint count, HYPRE_Int *src, HYPRE_Int *mid, MPI_Comm comm, hypre_MPI_Request *request ) { HYPRE_Int my_id, lsrc, retcode; if ( *src < 0 ) lsrc = hypre_MPI_ANY_SOURCE; else lsrc = (*src); retcode = hypre_MPI_Irecv( buf, (HYPRE_Int) count, hypre_MPI_BYTE, lsrc, *mid, comm, request); if ( retcode != 0 ) { hypre_MPI_Comm_rank(comm, &my_id); hypre_printf("%d : MH_Irecv warning : retcode = %d\n", my_id, retcode); } return 0; } HYPRE_Int MH_Wait(void* buf, hypre_uint count, HYPRE_Int *src, HYPRE_Int *mid, MPI_Comm comm, hypre_MPI_Request *request ) { hypre_MPI_Status status; HYPRE_Int my_id, incount, retcode; retcode = hypre_MPI_Wait( request, &status ); if ( retcode != 0 ) { hypre_MPI_Comm_rank(comm, &my_id); hypre_printf("%d : MH_Wait warning : retcode = %d\n", my_id, retcode); } hypre_MPI_Get_count(&status, hypre_MPI_BYTE, &incount); if ( *src < 0 ) *src = status.hypre_MPI_SOURCE; return incount; } HYPRE_Int MH_Send(void* buf, hypre_uint count, HYPRE_Int dest, HYPRE_Int mid, MPI_Comm comm ) { HYPRE_Int my_id; HYPRE_Int retcode = hypre_MPI_Send( buf, (HYPRE_Int) count, hypre_MPI_BYTE, dest, mid, comm); if ( retcode != 0 ) { hypre_MPI_Comm_rank(comm, &my_id); hypre_printf("%d : MH_Send warning : retcode = %d\n", my_id, retcode); } return 0; } /****************************************************************************/ /* wrapper function for interprocessor communication for matvec and getrow */ /*--------------------------------------------------------------------------*/ HYPRE_Int MH_ExchBdry(HYPRE_Real *vec, void *obj) { HYPRE_Int i, j, msgid, leng, src, dest, offset, *tempList; HYPRE_Real *dbuf; MH_Context *context; MH_Matrix *Amat; MPI_Comm comm; hypre_MPI_Request *request; HYPRE_Int sendProcCnt, recvProcCnt; HYPRE_Int *sendProc, *recvProc; HYPRE_Int *sendLeng, *recvLeng; HYPRE_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; request = hypre_TAlloc( hypre_MPI_Request , recvProcCnt , HYPRE_MEMORY_HOST); msgid = 234; offset = nRows; for ( i = 0; i < recvProcCnt; i++ ) { leng = recvLeng[i] * sizeof( HYPRE_Real ); 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( HYPRE_Real ); dbuf = hypre_TAlloc(HYPRE_Real, 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); if ( dbuf != NULL ) free( dbuf ); } offset = nRows; for ( i = 0; i < recvProcCnt; i++ ) { leng = recvLeng[i] * sizeof( HYPRE_Real ); src = recvProc[i]; MH_Wait((void*) &(vec[offset]), leng, &src, &msgid, comm, &request[i]); offset += recvLeng[i]; } free ( request ); return 1; } /****************************************************************************/ /* matvec function for local matrix structure MH_Matrix */ /*--------------------------------------------------------------------------*/ HYPRE_Int MH_MatVec(void *obj, HYPRE_Int leng1, HYPRE_Real p[], HYPRE_Int leng2, HYPRE_Real ap[]) { MH_Context *context; MPI_Comm comm; MH_Matrix *Amat; HYPRE_Int i, j, length, nRows, ibeg, iend, k; HYPRE_Real *dbuf, sum; HYPRE_Int *rowptr, *colnum; HYPRE_Real *values; context = (MH_Context *) obj; comm = context->comm; 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( HYPRE_Real , 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; } if ( dbuf != NULL ) free( dbuf ); return 1; } /****************************************************************************/ /* getrow function for local matrix structure MH_Matrix (ML compatible) */ /*--------------------------------------------------------------------------*/ HYPRE_Int MH_GetRow(void *obj, HYPRE_Int N_requested_rows, HYPRE_Int requested_rows[], HYPRE_Int allocated_space, HYPRE_Int columns[], HYPRE_Real values[], HYPRE_Int row_lengths[]) { HYPRE_Int i, j, ncnt, colindex, rowLeng, rowindex; MH_Context *context = (MH_Context *) obj; MH_Matrix *Amat = (MH_Matrix*) context->Amat; HYPRE_Int nRows = Amat->Nrows; HYPRE_Int *rowptr = Amat->rowptr; HYPRE_Int *colInd = Amat->colnum; HYPRE_Real *colVal = Amat->values; HYPRE_Int *mapList = Amat->map; ncnt = 0; for ( i = 0; i < N_requested_rows; i++ ) { rowindex = requested_rows[i]; rowLeng = rowptr[rowindex+1] - rowptr[rowindex]; if ( ncnt+rowLeng > allocated_space ) 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_ParCSRMLCreate */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLCreate( MPI_Comm comm, HYPRE_Solver *solver) { /* 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->pre = 0; /* default is Gauss Seidel */ link->post = 0; /* default is Gauss Seidel */ link->pre_sweeps = 2; /* default is 2 smoothing steps */ link->post_sweeps = 2; link->BGS_blocksize = 3; link->jacobi_wt = 0.5; /* default damping factor */ link->ml_ag = NULL; link->ag_threshold = 0.18; /* threshold for aggregation */ link->contxt = NULL; /* context for matvec */ /* create the ML structure */ ML_Create( &(link->ml_ptr), link->nlevels ); *solver = (HYPRE_Solver) link; return 0; } /****************************************************************************/ /* HYPRE_ParCSRMLDestroy */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLDestroy( HYPRE_Solver solver ) { HYPRE_Int i; MH_Matrix *Amat; MH_Link *link = (MH_Link *) solver; if ( link->ml_ag != NULL ) ML_Aggregate_Destroy( &(link->ml_ag) ); ML_Destroy( &(link->ml_ptr) ); if ( link->contxt->partition != NULL ) free( link->contxt->partition ); if ( link->contxt->Amat != NULL ) { Amat = (MH_Matrix *) link->contxt->Amat; if ( Amat->sendProc != NULL ) free (Amat->sendProc); if ( Amat->sendLeng != NULL ) free (Amat->sendLeng); if ( Amat->sendList != NULL ) { for (i = 0; i < Amat->sendProcCnt; i++ ) if (Amat->sendList[i] != NULL) free (Amat->sendList[i]); free (Amat->sendList); } if ( Amat->recvProc != NULL ) free (Amat->recvProc); if ( Amat->recvLeng != NULL ) free (Amat->recvLeng); if ( Amat->map != NULL ) free (Amat->map); free( Amat ); } if ( link->contxt != NULL ) free( link->contxt ); free( link ); return 0; } /****************************************************************************/ /* HYPRE_ParCSRMLSetup */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_Int i, my_id, nprocs, coarsest_level, level, sweeps, nlevels; HYPRE_Int *row_partition, localEqns, length; HYPRE_Int Nblocks, *blockList; HYPRE_Real 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 */ /* -------------------------------------------------------- */ hypre_MPI_Comm_rank(link->comm, &my_id); hypre_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(HYPRE_Int, (nprocs+1), HYPRE_MEMORY_HOST); for (i=0; i<=nprocs; i++) context->partition[i] = row_partition[i]; hypre_TFree( row_partition ); mh_mat = hypre_TAlloc( MH_Matrix, 1, HYPRE_MEMORY_HOST); context->Amat = mh_mat; HYPRE_ParCSRMLConstructMHMatrix(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 aggregate context */ /* -------------------------------------------------------- */ ML_Aggregate_Create(&(link->ml_ag)); link->ml_ag->max_levels = link->nlevels; ML_Aggregate_Set_Threshold( link->ml_ag, link->ag_threshold ); /* -------------------------------------------------------- */ /* perform aggregation */ /* -------------------------------------------------------- */ coarsest_level = ML_Gen_MGHierarchy_UsingAggregation(ml, nlevels-1, ML_DECREASING, link->ml_ag); if ( my_id == 0 ) hypre_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_SmootherJacobi(ml, level, ML_PRESMOOTHER, sweeps, wght); break; case 1 : ML_Gen_SmootherGaussSeidel(ml, level, ML_PRESMOOTHER, sweeps); break; case 2 : ML_Gen_SmootherSymGaussSeidel(ml,level,ML_PRESMOOTHER,sweeps,1.0); break; case 3 : Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_SmootherVBlockGaussSeidel(ml,level,ML_PRESMOOTHER, sweeps, Nblocks, blockList); break; case 4 : Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_SmootherVBlockJacobi(ml,level,ML_PRESMOOTHER, sweeps, wght, Nblocks, blockList); break; } sweeps = link->post_sweeps; switch ( link->post ) { case 0 : ML_Gen_SmootherJacobi(ml, level, ML_POSTSMOOTHER, sweeps, wght); break; case 1 : ML_Gen_SmootherGaussSeidel(ml, level, ML_POSTSMOOTHER, sweeps); break; case 2 : ML_Gen_SmootherSymGaussSeidel(ml,level,ML_POSTSMOOTHER,sweeps,1.0); break; case 3 : Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_SmootherVBlockGaussSeidel(ml,level,ML_POSTSMOOTHER, sweeps, Nblocks, blockList); break; case 4 : Nblocks = ML_Aggregate_Get_AggrCount( link->ml_ag, level ); ML_Aggregate_Get_AggrMap( link->ml_ag, level, &blockList ); ML_Gen_SmootherVBlockJacobi(ml,level,ML_POSTSMOOTHER, sweeps, wght, Nblocks, blockList); break; } } ML_Gen_CoarseSolverSuperLU(ml, coarsest_level); //ML_Gen_SmootherGaussSeidel(ml, coarsest_level, ML_PRESMOOTHER, 100); ML_Gen_Solver(ml, ML_MGV, nlevels-1, coarsest_level); return 0; } /****************************************************************************/ /* HYPRE_ParCSRMLSolve */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { HYPRE_Real *rhs, *sol; MH_Link *link = (MH_Link *) solver; ML *ml = link->ml_ptr; HYPRE_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; } /****************************************************************************/ /* HYPRE_ParCSRMLSetStrongThreshold */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetStrongThreshold(HYPRE_Solver solver, HYPRE_Real strong_threshold) { MH_Link *link = (MH_Link *) solver; if ( strong_threshold < 0.0 ) { hypre_printf("HYPRE_ParCSRMLSetStrongThreshold error : reset to 0.\n"); link->ag_threshold = 0.0; } else { link->ag_threshold = strong_threshold; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLSetNumPreSmoothings */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetNumPreSmoothings( HYPRE_Solver solver, HYPRE_Int num_sweeps ) { MH_Link *link = (MH_Link *) solver; if ( num_sweeps < 0 ) { hypre_printf("HYPRE_ParCSRMLSetNumPreSmoothings error : reset to 0.\n"); link->pre_sweeps = 0; } else { link->pre_sweeps = num_sweeps; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParMLSetNumPostSmoothings */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetNumPostSmoothings( HYPRE_Solver solver, HYPRE_Int num_sweeps ) { MH_Link *link = (MH_Link *) solver; if ( num_sweeps < 0 ) { hypre_printf("HYPRE_ParCSRMLSetNumPostSmoothings error : reset to 0.\n"); link->post_sweeps = 0; } else { link->post_sweeps = num_sweeps; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLSetPreSmoother */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetPreSmoother( HYPRE_Solver solver, HYPRE_Int smoother_type ) { MH_Link *link = (MH_Link *) solver; if ( smoother_type < 0 || smoother_type > 4 ) { hypre_printf("HYPRE_ParCSRMLSetPreSmoother error : set to Jacobi.\n"); link->pre = 0; } else { link->pre = smoother_type; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLSetPostSmoother */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetPostSmoother( HYPRE_Solver solver, HYPRE_Int smoother_type ) { MH_Link *link = (MH_Link *) solver; if ( smoother_type < 0 || smoother_type > 4 ) { hypre_printf("HYPRE_ParCSRMLSetPostSmoother error : set to Jacobi.\n"); link->post = 0; } else { link->post = smoother_type; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLSetDampingFactor */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetDampingFactor( HYPRE_Solver solver, HYPRE_Real factor ) { MH_Link *link = (MH_Link *) solver; if ( factor < 0.0 || factor > 1.0 ) { hypre_printf("HYPRE_ParCSRMLSetDampingFactor error : set to 0.5.\n"); link->jacobi_wt = 0.5; } else { link->jacobi_wt = factor; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLSetDampingFactor */ /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLSetBGSBlockSize( HYPRE_Solver solver, HYPRE_Int size ) { MH_Link *link = (MH_Link *) solver; if ( size < 0 ) { hypre_printf("HYPRE_ParCSRMLSetBGSBlockSize error : reset to 1.\n"); link->BGS_blocksize = 1; } else { link->BGS_blocksize = size; } return( 0 ); } /****************************************************************************/ /* HYPRE_ParCSRMLConstructMHMatrix * /*--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRMLConstructMHMatrix(HYPRE_ParCSRMatrix A, MH_Matrix *mh_mat, MPI_Comm comm, HYPRE_Int *partition,MH_Context *obj) { HYPRE_Int i, j, index, my_id, nprocs, msgid, *tempCnt; HYPRE_Int sendProcCnt, *sendLeng, *sendProc, **sendList; HYPRE_Int recvProcCnt, *recvLeng, *recvProc; HYPRE_Int rowLeng, *colInd, startRow, endRow, localEqns; HYPRE_Int *diagSize, *offdiagSize, externLeng, *externList, ncnt, nnz; HYPRE_Int *rowptr, *columns, num_bdry; HYPRE_Real *colVal, *values; hypre_MPI_Request *Request; hypre_MPI_Status status; /* -------------------------------------------------------- */ /* get machine information and local matrix information */ /* -------------------------------------------------------- */ hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &nprocs); 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(HYPRE_Int, localEqns , HYPRE_MEMORY_HOST); offdiagSize = hypre_TAlloc(HYPRE_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(HYPRE_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); } qsort0( externList, 0, externLeng-1 ); ncnt = 0; for ( i = 1; i < externLeng; i++ ) { if ( externList[i] != externList[ncnt] ) externList[++ncnt] = externList[i]; } externLeng = ncnt + 1; /* -------------------------------------------------------- */ /* allocate the CSR matrix */ /* -------------------------------------------------------- */ nnz = 0; for ( i = 0; i < localEqns; i++ ) nnz += diagSize[i] + offdiagSize[i]; rowptr = hypre_TAlloc(HYPRE_Int, (localEqns + 1) , HYPRE_MEMORY_HOST); columns = hypre_TAlloc(HYPRE_Int, nnz , HYPRE_MEMORY_HOST); values = hypre_TAlloc(HYPRE_Real, nnz , HYPRE_MEMORY_HOST); rowptr[0] = 0; for ( i = 1; i <= localEqns; i++ ) rowptr[i] = rowptr[i-1] + diagSize[i-1] + offdiagSize[i-1]; free( diagSize ); free( offdiagSize ); /* -------------------------------------------------------- */ /* 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); } 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 */ /* -------------------------------------------------------- */ if ( nprocs > 1 ) { /* ----------------------------------------------------- */ /* count number of elements to be received from each */ /* remote processor (assume sequential mapping) */ /* ----------------------------------------------------- */ tempCnt = hypre_TAlloc(HYPRE_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(HYPRE_Int, recvProcCnt , HYPRE_MEMORY_HOST); recvProc = hypre_TAlloc(HYPRE_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(HYPRE_Int, nprocs , HYPRE_MEMORY_HOST); for ( i = 0; i < nprocs; i++ ) tempCnt[i] = 0; for ( i = 0; i < recvProcCnt; i++ ) tempCnt[recvProc[i]] = 1; hypre_MPI_Allreduce(tempCnt, sendLeng, nprocs, HYPRE_MPI_INT, hypre_MPI_SUM, comm ); sendProcCnt = sendLeng[my_id]; free( sendLeng ); if ( sendProcCnt > 0 ) { sendLeng = hypre_TAlloc(HYPRE_Int, sendProcCnt , HYPRE_MEMORY_HOST); sendProc = hypre_TAlloc(HYPRE_Int, sendProcCnt , HYPRE_MEMORY_HOST); sendList = hypre_TAlloc(HYPRE_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++ ) { hypre_MPI_Send((void*) &recvLeng[i],1,HYPRE_MPI_INT,recvProc[i],msgid,comm); } for ( i = 0; i < sendProcCnt; i++ ) { hypre_MPI_Recv((void*) &sendLeng[i],1,HYPRE_MPI_INT,hypre_MPI_ANY_SOURCE,msgid, comm,&status); sendProc[i] = status.hypre_MPI_SOURCE; sendList[i] = hypre_TAlloc(HYPRE_Int, sendLeng[i] , HYPRE_MEMORY_HOST); if ( sendList[i] == NULL ) hypre_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 */ /* ----------------------------------------------------- */ msgid = 540; for ( i = 0; i < recvProcCnt; i++ ) { if ( recvProc[i] == 0 ) j = 0; else j = tempCnt[recvProc[i]-1]; rowLeng = recvLeng[i]; hypre_MPI_Send((void*) &externList[j],rowLeng,HYPRE_MPI_INT,recvProc[i], msgid,comm); } for ( i = 0; i < sendProcCnt; i++ ) { rowLeng = sendLeng[i]; hypre_MPI_Recv((void*)sendList[i],rowLeng,HYPRE_MPI_INT,sendProc[i], msgid,comm,&status); } /* ----------------------------------------------------- */ /* 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 ) { hypre_printf("%d : Construct MH matrix Error - index out "); hypre_printf("of range%d\n", my_id, 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 */ /* ----------------------------------------------------- */ free( tempCnt ); } return 0; } #endif hypre-2.18.2/src/parcsr_ls/HYPRE_parcsr_pcg.c000066400000000000000000000261641355566575400210060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_PCGFunctions * pcg_functions; if (!solver) { hypre_error_in_arg(2); return hypre_error_flag; } pcg_functions = hypre_PCGFunctionsCreate( hypre_CAlloc, 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_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 ) { return 0; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRDiagScale *--------------------------------------------------------------------------*/ HYPRE_Int HYPRE_ParCSRDiagScale( HYPRE_Solver solver, HYPRE_ParCSRMatrix HA, HYPRE_ParVector Hy, HYPRE_ParVector Hx ) { hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) HA; hypre_ParVector *y = (hypre_ParVector *) Hy; hypre_ParVector *x = (hypre_ParVector *) Hx; HYPRE_Real *x_data = hypre_VectorData(hypre_ParVectorLocalVector(x)); HYPRE_Real *y_data = hypre_VectorData(hypre_ParVectorLocalVector(y)); HYPRE_Real *A_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A)); HYPRE_Int *A_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A)); HYPRE_Int local_size = hypre_VectorSize(hypre_ParVectorLocalVector(x)); HYPRE_Int ierr = 0; #if defined(HYPRE_USING_CUDA) hypreDevice_DiagScaleVector(local_size, A_i, A_data, y_data, x_data); //hypre_SyncCudaComputeStream(hypre_handle); #else /* #if defined(HYPRE_USING_CUDA) */ HYPRE_Int i; #if defined(HYPRE_USING_DEVICE_OPENMP) #pragma omp target teams distribute parallel for private(i) is_device_ptr(x_data,y_data,A_data,A_i) #elif defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i=0; i < local_size; i++) { x_data[i] = y_data[i]/A_data[A_i[i]]; } #endif /* #if defined(HYPRE_USING_CUDA) */ return ierr; } /*-------------------------------------------------------------------------- * HYPRE_ParCSRSymPrecondSetup *--------------------------------------------------------------------------*/ /* HYPRE_Int HYPRE_ParCSRSymPrecondSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A, HYPRE_ParVector b, HYPRE_ParVector x ) { hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) A; hypre_ParVector *y = (hypre_ParVector *) b; hypre_ParVector *x = (hypre_ParVector *) x; HYPRE_Real *x_data = hypre_VectorData(hypre_ParVectorLocalVector(x)); HYPRE_Real *y_data = hypre_VectorData(hypre_ParVectorLocalVector(y)); HYPRE_Real *A_diag = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A)); HYPRE_Real *A_offd = hypre_CSRMatrixData(hypre_ParCSRMatrixOffD(A)); HYPRE_Int i, ierr = 0; hypre_ParCSRMatrix *Asym; MPI_Comm comm; HYPRE_Int global_num_rows; HYPRE_Int global_num_cols; HYPRE_Int *row_starts; HYPRE_Int *col_starts; HYPRE_Int num_cols_offd; HYPRE_Int num_nonzeros_diag; HYPRE_Int num_nonzeros_offd; Asym = hypre_ParCSRMatrixCreate(comm, global_num_rows, global_num_cols, row_starts, col_starts, num_cols_offd, num_nonzeros_diag, num_nonzeros_offd); for (i=0; i < hypre_VectorSize(hypre_ParVectorLocalVector(x)); i++) { x_data[i] = y_data[i]/A_data[A_i[i]]; } return ierr; } */ hypre-2.18.2/src/parcsr_ls/HYPRE_parcsr_pilut.c000066400000000000000000000141441355566575400213650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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 ) { #ifdef HYPRE_MIXEDINT 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 ) { #ifdef HYPRE_MIXEDINT 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_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_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_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-2.18.2/src/parcsr_ls/HYPRE_parcsr_schwarz.c000066400000000000000000000122301355566575400217030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/parcsr_ls/Makefile000066400000000000000000000076031355566575400172050ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../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\ 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_ams.c\ gen_redcs_mat.c\ HYPRE_parcsr_amg.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_ParaSails.c\ HYPRE_parcsr_pcg.c\ HYPRE_parcsr_pilut.c\ HYPRE_parcsr_schwarz.c\ HYPRE_ams.c\ HYPRE_ads.c\ HYPRE_ame.c\ par_amg.c\ par_amg_setup.c\ par_amg_solve.c\ par_amg_solveT.c\ par_cg_relax_wt.c\ par_coarsen.c\ par_coarsen_device.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_indepset_device.c\ par_interp.c\ par_interp_device.c\ par_interp_trunc_device.c\ par_jacobi_interp.c\ par_multi_interp.c\ par_laplace.c\ par_laplace_27pt.c\ par_laplace_9pt.c\ par_lr_interp.c\ par_mgr.c\ par_mgr_setup.c\ par_mgr_solve.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_strength_device.c\ par_sv_interp.c\ par_sv_interp_ln.c\ par_vardifconv.c\ par_vardifconv_rs.c\ partial.c\ pcg_par.c\ schwarz.c\ block_tridiag.c\ ams.c\ ads.c\ ame.c\ par_restr.c\ par_lr_restr.c\ superlu.c OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/parcsr_ls/_hypre_parcsr_ls.h000066400000000000000000004361101355566575400212530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_ls.h" #ifndef hypre_PARCSR_LS_HEADER #define hypre_PARCSR_LS_HEADER #include "_hypre_utilities.h" #include "krylov.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.h" #include "HYPRE_lobpcg.h" #ifdef __cplusplus extern "C" { #endif typedef struct { HYPRE_Int prev; HYPRE_Int next; } Link; #ifndef hypre_ParAMG_DATA_HEADER #define hypre_ParAMG_DATA_HEADER #define CUMNUMIT #include "par_csr_block_matrix.h" /*-------------------------------------------------------------------------- * hypre_ParAMGData *--------------------------------------------------------------------------*/ typedef struct { /* setup params */ HYPRE_Int max_levels; HYPRE_Real strong_threshold; 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; /* problem data */ hypre_ParCSRMatrix *A; HYPRE_Int num_variables; HYPRE_Int num_functions; HYPRE_Int nodal; HYPRE_Int nodal_levels; HYPRE_Int nodal_diag; HYPRE_Int num_points; HYPRE_Int *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_Int **CF_marker_array; HYPRE_Int **dof_func_array; HYPRE_Int **dof_point_array; HYPRE_Int **point_dof_map_array; HYPRE_Int num_levels; HYPRE_Real **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; 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_Real **cheby_ds; HYPRE_Real **cheby_coefs; /* 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_Int gs_setup; HYPRE_Real *A_mat, *A_inv; HYPRE_Real *b_vec; HYPRE_Int *comm_info; /* 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 indexes as coarse grid points */ HYPRE_Int C_point_keep_level; HYPRE_Int num_C_point_marker; HYPRE_Int **C_point_marker_array; #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_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_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_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_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_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_ParAMGDataCPointMarkerArray(amg_data) ((amg_data)-> C_point_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_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) /* 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_ParAMGDataAMat(amg_data) ((amg_data)->A_mat) #define hypre_ParAMGDataAInv(amg_data) ((amg_data)->A_inv) #define hypre_ParAMGDataBVec(amg_data) ((amg_data)->b_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_ParAMGDataCPointKeepMarkerArray(amg_data) ((amg_data)-> C_point_marker_array) #define hypre_ParAMGDataCPointKeepLevel(amg_data) ((amg_data)-> C_point_keep_level) #define hypre_ParAMGDataNumCPointKeep(amg_data) ((amg_data)-> num_C_point_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 /* 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_Int 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_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_AMGHybridSetNumFunctions ( void *AMGhybrid_vdata , HYPRE_Int num_functions ); HYPRE_Int hypre_AMGHybridSetNodal ( void *AMGhybrid_vdata , HYPRE_Int nodal ); 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_Int 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 ); HYPRE_Int hypre_ParCSRRelaxThreads ( 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_ParVector *u , hypre_ParVector *Vtemp , hypre_ParVector *z ); /* 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_Int 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_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_Int 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_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_BoomerAMGSetNumFunctions ( HYPRE_Solver solver , HYPRE_Int num_functions ); HYPRE_Int HYPRE_BoomerAMGGetNumFunctions ( HYPRE_Solver solver , HYPRE_Int *num_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_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_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_Int *cpt_coarse_index); /* 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_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_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_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_BoomerAMGSetSCommPkgSwitch ( void *data , HYPRE_Real S_commpkg_switch ); HYPRE_Int hypre_BoomerAMGGetSCommPkgSwitch ( void *data , HYPRE_Real *S_commpkg_switch ); 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_BoomerAMGSetNumFunctions ( void *data , HYPRE_Int num_functions ); HYPRE_Int hypre_BoomerAMGGetNumFunctions ( void *data , HYPRE_Int *num_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_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_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_BoomerAMGSetCpointsToKeep(void *data, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_Int *cpt_coarse_index); /* 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_Int **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 ); /* par_coarsen.c */ HYPRE_Int hypre_BoomerAMGCoarsen ( hypre_ParCSRMatrix *S , hypre_ParCSRMatrix *A , HYPRE_Int CF_init , HYPRE_Int debug_flag , HYPRE_Int **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenRuge ( hypre_ParCSRMatrix *S , hypre_ParCSRMatrix *A , HYPRE_Int measure_type , HYPRE_Int coarsen_type , HYPRE_Int debug_flag , HYPRE_Int **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenFalgout ( hypre_ParCSRMatrix *S , hypre_ParCSRMatrix *A , HYPRE_Int measure_type , HYPRE_Int debug_flag , HYPRE_Int **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenHMIS ( hypre_ParCSRMatrix *S , hypre_ParCSRMatrix *A , HYPRE_Int measure_type , HYPRE_Int debug_flag , HYPRE_Int **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMIS ( hypre_ParCSRMatrix *S , hypre_ParCSRMatrix *A , HYPRE_Int CF_init , HYPRE_Int debug_flag , HYPRE_Int **CF_marker_ptr ); HYPRE_Int hypre_BoomerAMGCoarsenPMISDevice( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int CF_init, HYPRE_Int debug_flag, HYPRE_Int **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_Int *dof_func , HYPRE_Int *CF_marker , HYPRE_Int **coarse_dof_func_ptr , HYPRE_BigInt **coarse_pnts_global_ptr ); /* par_coordinates.c */ float *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_Int **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_Int **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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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 *col_offd_S_to_A , 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 *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_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_Int *col_offd_S_to_A, 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 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , hypre_ParCSRMatrix **P_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_Int *col_offd_S_to_A , 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_Int *CFN_marker , HYPRE_Int *col_offd_SN_to_AN , HYPRE_Int num_functions , HYPRE_Int nodal , HYPRE_Int data , HYPRE_Int **dof_func_ptr , HYPRE_Int **CF_marker_ptr , HYPRE_Int **col_offd_S_to_A_ptr , hypre_ParCSRMatrix **S_ptr ); HYPRE_Int hypre_BoomerAMGCreateScalarCF ( HYPRE_Int *CFN_marker , HYPRE_Int num_functions , HYPRE_Int num_nodes , HYPRE_Int **dof_func_ptr , HYPRE_Int **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 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_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_Real S_commpkg_switch, 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_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_GaussElimSetup ( hypre_ParAMGData *amg_data , HYPRE_Int level , HYPRE_Int relax_type ); HYPRE_Int hypre_GaussElimSolve ( hypre_ParAMGData *amg_data , HYPRE_Int level , HYPRE_Int relax_type ); /* 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_Int hypre_ParCSRMaxEigEstimateCG ( 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 ); /* 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 ); /* 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_Int *CF_marker , HYPRE_Int num_var , HYPRE_Int *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCorrectCFMarker2 ( HYPRE_Int *CF_marker , HYPRE_Int num_var , HYPRE_Int *new_CF_marker ); HYPRE_Int hypre_BoomerAMGCreateSDevice(hypre_ParCSRMatrix *A, HYPRE_Real strength_threshold, HYPRE_Real max_row_sum, HYPRE_Int num_functions, HYPRE_Int *dof_func, hypre_ParCSRMatrix **S_ptr); /* 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_Int **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_Int **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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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_Int *col_offd_S_to_A , 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 ( HYPRE_Int count , HYPRE_Int elt_size ); 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_Real **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 ); /* RL */ 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, hypre_ParCSRMatrix **R_ptr); #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(); HYPRE_Int hypre_MGRDestroyFrelaxVcycleData( 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_MGRCoarsen(hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A,HYPRE_Int final_coarse_size,HYPRE_Int *final_coarse_indexes,HYPRE_Int debug_flag,HYPRE_Int **CF_marker,HYPRE_Int last_level); HYPRE_Int hypre_MGRSetReservedCoarseNodes(void *mgr_vdata, HYPRE_Int reserved_coarse_size, HYPRE_Int *reserved_coarse_nodes); 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_MGRBuildInterp(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 *col_offd_S_to_A, hypre_ParCSRMatrix **P, HYPRE_Int last_level, HYPRE_Int level, HYPRE_Int numsweeps); //HYPRE_Int hypre_MGRBuildRestrictionToper(hypre_ParCSRMatrix *AT, HYPRE_Int *CF_marker, hypre_ParCSRMatrix *ST, 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 *col_offd_ST_to_AT,hypre_ParCSRMatrix **RT,HYPRE_Int last_level,HYPRE_Int level, HYPRE_Int numsweeps); //HYPRE_Int hypre_BoomerAMGBuildInjectionInterp( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_Int *num_cpts_global, HYPRE_Int num_functions, HYPRE_Int debug_flag,HYPRE_Int init_data,hypre_ParCSRMatrix **P_ptr); 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_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_block_jacobi (hypre_ParCSRMatrix *A,hypre_ParVector *f,hypre_ParVector *u,HYPRE_Real blk_size,HYPRE_Int n_block,HYPRE_Int left_size,HYPRE_Real *diaginv,hypre_ParVector *Vtemp); HYPRE_Int hypre_blockRelax_setup(hypre_ParCSRMatrix *A,HYPRE_Int blk_size, HYPRE_Int reserved_coarse_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_ParVector *Vtemp,hypre_ParVector *Ztemp); HYPRE_Int hypre_MGRBuildAff( 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_MGRWriteSolverParams(void *mgr_vdata); 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_MGRSetRestrictType( void *mgr_vdata, HYPRE_Int interpType); HYPRE_Int hypre_MGRSetInterpType( void *mgr_vdata, HYPRE_Int interpType); HYPRE_Int hypre_MGRSetNumRelaxSweeps( 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_MGRSetPrintLevel( void *mgr_vdata, HYPRE_Int print_level ); HYPRE_Int hypre_MGRSetLogging( void *mgr_vdata, HYPRE_Int logging ); HYPRE_Int hypre_MGRSetMaxIter( void *mgr_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_MGRSetTol( void *mgr_vdata, HYPRE_Real tol ); // Accessor functions HYPRE_Int hypre_MGRGetNumIterations( void *mgr_vdata, HYPRE_Int *num_iterations ); HYPRE_Int hypre_MGRGetFinalRelativeResidualNorm( void *mgr_vdata, HYPRE_Real *res_norm ); #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/parcsr_ls/ads.c000066400000000000000000001570241355566575400164630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "float.h" #include "ams.h" #include "ads.h" /*-------------------------------------------------------------------------- * hypre_ADSCreate * * Allocate the ADS solver structure. *--------------------------------------------------------------------------*/ void * hypre_ADSCreate() { 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 -> 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 -> A_l1_norms) hypre_TFree(ads_data -> A_l1_norms, HYPRE_MEMORY_HOST); /* 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_Int 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) { 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 (HYPRE_AssumedPartitionCheck()) F2V = hypre_ParMatmul(C, G); else /* With global partitioning we can use the object structure in hypre to consider ParCSR matrices as Boolean matrices and vice versa. */ F2V = (hypre_ParCSRMatrix*) hypre_ParBooleanMatmul( (hypre_ParCSRBooleanMatrix*)C, (hypre_ParCSRBooleanMatrix*)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); #ifdef HYPRE_NO_GLOBAL_PARTITION col_starts_size = 2; #else HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); col_starts_size = num_procs+1; #endif 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_ParCSRMatrixOwnsRowStarts(Pi) = 0; hypre_ParCSRMatrixOwnsColStarts(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); 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 (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; } if (HYPRE_AssumedPartitionCheck()) hypre_ParCSRMatrixDestroy(F2V); else hypre_ParCSRBooleanMatrixDestroy((hypre_ParCSRBooleanMatrix*)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; /* 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 (HYPRE_AssumedPartitionCheck()) F2V = hypre_ParMatmul(C, G); else /* With global partitioning we can use the object structure in hypre to consider ParCSR matrices as Boolean matrices and vice versa. */ F2V = (hypre_ParCSRMatrix*) hypre_ParBooleanMatmul( (hypre_ParCSRBooleanMatrix*)C, (hypre_ParCSRBooleanMatrix*)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_ParCSRMatrixOwnsRowStarts(Pix) = 0; hypre_ParCSRMatrixOwnsColStarts(Pix) = 0; 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_ParCSRMatrixOwnsRowStarts(Piy) = 0; hypre_ParCSRMatrixOwnsColStarts(Piy) = 0; 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_ParCSRMatrixOwnsRowStarts(Piz) = 0; hypre_ParCSRMatrixOwnsColStarts(Piz) = 0; 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); 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 (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_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_ParCSRComputeL1Norms(ads_data -> A, ads_data -> A_relax_type, NULL, &ads_data -> A_l1_norms); /* 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) { HYPRE_Int C_owned_col_starts; if (!hypre_ParCSRMatrixCommPkg(ads_data -> C)) hypre_MatvecCommPkgCreate(ads_data -> C); if (!hypre_ParCSRMatrixCommPkg(ads_data -> A)) hypre_MatvecCommPkgCreate(ads_data -> A); C_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ads_data -> C); 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_ParCSRMatrixOwnsColStarts(ads_data -> C) = C_owned_col_starts; hypre_ParCSRMatrixOwnsRowStarts(ads_data -> A_C) = 0; } 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_Int P_owned_col_starts; 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); P_owned_col_starts = hypre_ParCSRMatrixOwnsRowStarts(ads_data -> Pix); hypre_BoomerAMGBuildCoarseOperator(ads_data -> Pix, ads_data -> A, ads_data -> Pix, &ads_data -> A_Pix); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ads_data -> A_Pix) = 0; hypre_ParCSRMatrixOwnsColStarts(ads_data -> A_Pix) = 0; } HYPRE_BoomerAMGSetup(ads_data -> B_Pix, (HYPRE_ParCSRMatrix)ads_data -> A_Pix, 0, 0); if (!hypre_ParCSRMatrixCommPkg(ads_data -> Piy)) hypre_MatvecCommPkgCreate(ads_data -> Piy); P_owned_col_starts = hypre_ParCSRMatrixOwnsRowStarts(ads_data -> Piy); hypre_BoomerAMGBuildCoarseOperator(ads_data -> Piy, ads_data -> A, ads_data -> Piy, &ads_data -> A_Piy); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ads_data -> A_Piy) = 0; hypre_ParCSRMatrixOwnsColStarts(ads_data -> A_Piy) = 0; } HYPRE_BoomerAMGSetup(ads_data -> B_Piy, (HYPRE_ParCSRMatrix)ads_data -> A_Piy, 0, 0); if (!hypre_ParCSRMatrixCommPkg(ads_data -> Piz)) hypre_MatvecCommPkgCreate(ads_data -> Piz); P_owned_col_starts = hypre_ParCSRMatrixOwnsRowStarts(ads_data -> Piz); hypre_BoomerAMGBuildCoarseOperator(ads_data -> Piz, ads_data -> A, ads_data -> Piz, &ads_data -> A_Piz); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ads_data -> A_Piz) = 0; hypre_ParCSRMatrixOwnsColStarts(ads_data -> A_Piz) = 0; } HYPRE_BoomerAMGSetup(ads_data -> B_Piz, (HYPRE_ParCSRMatrix)ads_data -> A_Piz, 0, 0); } 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); 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, 0, 0); } /* 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, r_norm, b_norm, 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_ParVector *z = NULL; 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; /* may need to create an additional temporary vector for relaxation */ if (hypre_NumThreads() > 1 || ads_data -> A_relax_type == 16) { z = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(z); hypre_ParVectorSetPartitioningOwner(z,0); } 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 = sqrt(hypre_ParVectorInnerProd(ads_data -> r0,ads_data -> r0)); r0_norm = r_norm; b_norm = 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, 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 = 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", 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); if (z) hypre_ParVectorDestroy(z); 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.18.2/src/parcsr_ls/ads.h000066400000000000000000000136021355566575400164610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Real *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; /* 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.18.2/src/parcsr_ls/ame.c000066400000000000000000000536501355566575400164560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "float.h" #include "ams.h" #include "temp_multivector.h" #include "lobpcg.h" #include "ame.h" /*-------------------------------------------------------------------------- * hypre_AMECreate * * Allocate the AMS eigensolver structure. *--------------------------------------------------------------------------*/ void * hypre_AMECreate() { 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 -> 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_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() *--------------------------------------------------------------------------*/ 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; /* 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_TAlloc(HYPRE_Int, ne, HYPRE_MEMORY_HOST); for (i = 0; i < ne; i++) edge_bc[i] = 0; /* 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); HYPRE_Real l1_norm; /* A row (edge) is boundary if its off-diag l1 norm is less than eps */ HYPRE_Real eps = DBL_EPSILON * 1e+4; 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 += fabs(AdA[j]); if (AoI) for (j = AoI[i]; j < AoI[i+1]; j++) l1_norm += fabs(AoA[j]); if (l1_norm < eps) edge_bc[i] = 1; } } hypre_ParCSRMatrixTranspose(ams_data->G, &Gt, 1); /* 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_CTAlloc(HYPRE_Int, hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(Gt)), HYPRE_MEMORY_HOST); hypre_MatvecCommPkgCreate(Gt); comm_pkg = hypre_ParCSRMatrixCommPkg(Gt); 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++] = edge_bc[k]; } } comm_handle = hypre_ParCSRCommHandleCreate(11, comm_pkg, int_buf_data, offd_edge_bc); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); } /* 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; 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, HYPRE_MEMORY_HOST); } /* 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); 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, 20); 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)); for (j = 0; j < ne; j++) if (edge_bc[j]) data[j] = 0.0; hypre_AMEDiscrDivFreeComponent(esolver, vi); } } } hypre_TFree(edge_bc, HYPRE_MEMORY_HOST); 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.18.2/src/parcsr_ls/ame.h000066400000000000000000000026551355566575400164620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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.18.2/src/parcsr_ls/amg_hybrid.c000066400000000000000000002124741355566575400200220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; /* 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 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( ) { 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; /* 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 -> 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; HYPRE_Int i; 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); for (i=0; i < 3; i++) { grid_relax_type[i] = 3; } 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_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_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_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 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; if (!AMGhybrid_data) { hypre_error_in_arg(1); return hypre_error_flag; } /*----------------------------------------------------------------------- * 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); 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) { if (pcg_solver == NULL) { pcg_functions = hypre_PCGFunctionsCreate( hypre_CAlloc, 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; /*--------------------------------------------------------------------- * Solve with DSCG. *---------------------------------------------------------------------*/ 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); } else if (solver_type == 2) { if (pcg_solver == NULL) { gmres_functions = hypre_GMRESFunctionsCreate( hypre_CAlloc, 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; /*--------------------------------------------------------------------- * Solve with diagonal scaled GMRES *---------------------------------------------------------------------*/ 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); } else if (solver_type == 3) { 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; /*--------------------------------------------------------------------- * Solve with diagonal scaled BiCGSTAB *---------------------------------------------------------------------*/ 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); } } /*--------------------------------------------------------------------- * If converged, done... *---------------------------------------------------------------------*/ if (converged) { if (logging) { (AMGhybrid_data -> final_rel_res_norm) = res_norm; } } /*----------------------------------------------------------------------- * ... otherwise, use AMG+solver *-----------------------------------------------------------------------*/ else { /*-------------------------------------------------------------------- * 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_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); } 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); /* Solve */ 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; } } 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); /* Solve */ 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; } } 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); /* Solve */ 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; } } } return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/ams.c000066400000000000000000004504711355566575400164760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "float.h" #include "ams.h" /*-------------------------------------------------------------------------- * 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(/* matrix to relax with */ hypre_ParCSRMatrix *A, /* right-hand side */ hypre_ParVector *f, /* relaxation type */ HYPRE_Int relax_type, /* number of sweeps */ HYPRE_Int relax_times, /* l1 norms of the rows of A */ HYPRE_Real *l1_norms, /* damping coefficient (usually <= 1) */ HYPRE_Real relax_weight, /* SOR parameter (usually in (0,2) */ HYPRE_Real omega, /* for cheby smoothers */ HYPRE_Real max_eig_est, HYPRE_Real min_eig_est, HYPRE_Int cheby_order, HYPRE_Real cheby_fraction, /* initial/updated approximation */ hypre_ParVector *u, /* temporary vector */ hypre_ParVector *v, /* temporary vector */ hypre_ParVector *z) { HYPRE_Int sweep; 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)); for (sweep = 0; sweep < relax_times; sweep++) { if (relax_type == 1) /* l1-scaled Jacobi */ { HYPRE_Int num_rows = hypre_ParCSRMatrixNumRows(A); #ifdef HYPRE_USING_UNIFIED_MEMORY if (sweep == 0) { /* prefetch l1 norms */ hypre_TMemcpy(l1_norms, l1_norms, HYPRE_Real, num_rows, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_SHARED); } #endif hypre_HandleCudaComputeStreamSyncPush(hypre_handle, 0); hypre_ParVectorCopy(f, v); hypre_ParCSRMatrixMatvec(-relax_weight, A, u, relax_weight, v); #if defined(HYPRE_USING_CUDA) hypreDevice_IVAXPY(num_rows, l1_norms, v_data, u_data); #else /* #if defined(HYPRE_USING_CUDA) */ HYPRE_Int i; /* u += w D^{-1}(f - A u), where D_ii = ||A(i,:)||_1 */ #if defined(HYPRE_USING_DEVICE_OPENMP) #pragma omp target teams distribute parallel for private(i) is_device_ptr(u_data,v_data,l1_norms) #endif for (i = 0; i < num_rows; i++) { u_data[i] += v_data[i] / l1_norms[i]; } #endif /* #if defined(HYPRE_USING_CUDA) */ hypre_HandleCudaComputeStreamSyncPop(hypre_handle); hypre_SyncCudaComputeStream(hypre_handle); } else if (relax_type == 2 || relax_type == 4) /* offd-l1-scaled block GS */ { 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 i, j; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Real *u_offd_data = hypre_TAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); HYPRE_Real res; HYPRE_Int num_procs; hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); /* Copy off-diagonal values of u to the current processor */ if (num_procs > 1) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends; HYPRE_Real *u_buf_data; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int index = 0, start; 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); 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); } if (relax_weight == 1.0 && omega == 1.0) /* symmetric Gauss-Seidel */ { /* 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]]; if (num_cols_offd) 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]]; u_data[i] += res / l1_norms[i]; } /* 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]]; if (num_cols_offd) 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]]; u_data[i] += res / l1_norms[i]; } } else if (relax_weight == 1.0) /* SSOR */ { /* 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]]; if (num_cols_offd) 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]]; u_data[i] += omega * res / l1_norms[i]; } /* 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]]; if (num_cols_offd) 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]]; u_data[i] += omega * res / l1_norms[i]; } } else /* scaled SSOR */ { HYPRE_Real dif; HYPRE_Real c1 = omega * relax_weight; HYPRE_Real c2 = omega * (1.0 - relax_weight); /* Forward local pass (save initial guess in v_data) */ for (i = 0; i < num_rows; i++) { dif = 0.0; v_data[i] = u_data[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]]; if (A_diag_J[j] < i) dif += A_diag_data[j] * (v_data[A_diag_J[j]] - u_data[A_diag_J[j]]); } if (num_cols_offd) 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]]; u_data[i] += (c1 * res + c2 * dif) / l1_norms[i]; } /* Backward local pass */ for (i = num_rows-1; i > -1; i--) { dif = 0.0; 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]]; if (A_diag_J[j] > i) dif += A_diag_data[j] * (v_data[A_diag_J[j]] - u_data[A_diag_J[j]]); } if (num_cols_offd) 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]]; u_data[i] += (c1 * res + c2 * dif) / l1_norms[i]; } } hypre_TFree(u_offd_data, HYPRE_MEMORY_HOST); } else if (relax_type == 3) /* Kaczmarz */ { 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 i, j; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Real *u_offd_data = hypre_TAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); HYPRE_Real res; HYPRE_Int num_procs; hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs); /* Copy off-diagonal values of u to the current processor */ if (num_procs > 1) { hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends; HYPRE_Real *u_buf_data; hypre_ParCSRCommHandle *comm_handle; HYPRE_Int index = 0, start; 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); 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]]; if (num_cols_offd) 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]]; if (num_cols_offd) 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); } 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; hypre_ParVectorOwnsPartitioning(x) = 0; 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; hypre_ParVectorOwnsPartitioning(x) = 0; 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]]. *--------------------------------------------------------------------------*/ 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]; 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])); 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]; 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])); 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]; hypre_ParVector *x_[3]; 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_ParCSRMatrixFixZeroRows(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 += fabs(A_diag_data[j]); if (num_cols_offd) for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++) l1_norm += fabs(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; } /*-------------------------------------------------------------------------- * 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. *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRComputeL1Norms(hypre_ParCSRMatrix *A, HYPRE_Int option, HYPRE_Int *cf_marker, HYPRE_Real **l1_norm_ptr) { 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 *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; HYPRE_Real *l1_norm = hypre_TAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_SHARED); 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); } if (option == 1) { for (i = 0; i < num_rows; 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] += fabs(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] += fabs(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] += fabs(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] += fabs(A_offd_data[j]); } } } } else if (option == 2) { for (i = 0; i < num_rows; i++) { /* Add the diag element of the ith row */ l1_norm[i] = fabs(A_diag_data[A_diag_I[i]]); if (cf_marker == NULL) { /* 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] += fabs(A_offd_data[j]); } } else { cf_diag = cf_marker[i]; /* 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] += fabs(A_offd_data[j]); } } } } else if (option == 3) { for (i = 0; i < num_rows; 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 = 0; i < num_rows; i++) { /* Add the diag element of the ith row */ diag = l1_norm[i] = fabs(A_diag_data[A_diag_I[i]]); if (cf_marker == NULL) { /* Add the scaled 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*fabs(A_offd_data[j]); } } else { cf_diag = cf_marker[i]; /* Add the scaled 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*fabs(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 */ { for (i = 0; i < num_rows; i++) { diag = A_diag_data[A_diag_I[i]]; if (diag != 0.0) l1_norm[i] = diag; else l1_norm[i] = 1.0; } *l1_norm_ptr = l1_norm; return hypre_error_flag; } /* Handle negative definite matrices */ for (i = 0; i < num_rows; i++) if (A_diag_data[A_diag_I[i]] < 0) l1_norm[i] = -l1_norm[i]; for (i = 0; i < num_rows; i++) /* if (fabs(l1_norm[i]) < DBL_EPSILON) */ if (fabs(l1_norm[i]) == 0.0) { hypre_error_in_arg(1); break; } //for (i = 0; i < num_rows; i++) l1_norm[i]=1.0/l1_norm[i]; hypre_TFree(cf_marker_offd, HYPRE_MEMORY_HOST); *l1_norm_ptr = l1_norm; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetDiagRows * * For every row containing only a diagonal element: set it to d. *--------------------------------------------------------------------------*/ 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); 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() { 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 -> 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 -> 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); if (ams_data -> A_l1_norms) hypre_TFree(ams_data -> A_l1_norms, HYPRE_MEMORY_SHARED); /* 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 != 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_Int 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. *--------------------------------------------------------------------------*/ 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_ParCSRMatrix *Pi; /* Compute Pi = [Pi_x, Pi_y, Pi_z] */ { HYPRE_Int i, j, d; 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 = dim*hypre_ParCSRMatrixGlobalNumCols(G); HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(G); HYPRE_BigInt *col_starts; HYPRE_Int col_starts_size; 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)); HYPRE_BigInt *col_starts_G = hypre_ParCSRMatrixColStarts(G); #ifdef HYPRE_NO_GLOBAL_PARTITION col_starts_size = 2; #else HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); col_starts_size = num_procs+1; #endif col_starts = hypre_TAlloc(HYPRE_BigInt, col_starts_size, HYPRE_MEMORY_HOST); for (i = 0; i < col_starts_size; i++) col_starts[i] = (HYPRE_BigInt)dim * col_starts_G[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_ParCSRMatrixOwnsRowStarts(Pi) = 0; hypre_ParCSRMatrixOwnsColStarts(Pi) = 1; hypre_ParCSRMatrixInitialize(Pi); Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(Gy)); if (dim == 3) Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(Gz)); /* 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); 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++ = fabs(G_diag_data[j]) * 0.5 * Gx_data[i]; *Pi_diag_data++ = fabs(G_diag_data[j]) * 0.5 * Gy_data[i]; if (dim == 3) *Pi_diag_data++ = fabs(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 (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++ = fabs(G_offd_data[j]) * 0.5 * Gx_data[i]; *Pi_offd_data++ = fabs(G_offd_data[j]) * 0.5 * Gy_data[i]; if (dim == 3) *Pi_offd_data++ = fabs(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. *--------------------------------------------------------------------------*/ 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_ParCSRMatrix *Pix, *Piy, *Piz; /* 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_ParCSRMatrixOwnsRowStarts(Pix) = 0; hypre_ParCSRMatrixOwnsColStarts(Pix) = 0; 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_ParCSRMatrixOwnsRowStarts(Piy) = 0; hypre_ParCSRMatrixOwnsColStarts(Piy) = 0; 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_ParCSRMatrixOwnsRowStarts(Piz) = 0; hypre_ParCSRMatrixOwnsColStarts(Piz) = 0; hypre_ParCSRMatrixInitialize(Piz); } Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); 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); 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++ = fabs(G_diag_data[j]) * 0.5 * Gx_data[i]; *Piy_diag_data++ = fabs(G_diag_data[j]) * 0.5 * Gy_data[i]; *Piz_diag_data++ = fabs(G_diag_data[j]) * 0.5 * Gz_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); 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); 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++ = fabs(G_diag_data[j]) * 0.5 * Gx_data[i]; *Piy_diag_data++ = fabs(G_diag_data[j]) * 0.5 * Gy_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 (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++ = fabs(G_offd_data[j]) * 0.5 * Gx_data[i]; *Piy_offd_data++ = fabs(G_offd_data[j]) * 0.5 * Gy_data[i]; *Piz_offd_data++ = fabs(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 { 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 (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++ = fabs(G_offd_data[j]) * 0.5 * Gx_data[i]; *Piy_offd_data++ = fabs(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]; } } } *Pix_ptr = Pix; *Piy_ptr = Piy; if (dim == 3) *Piz_ptr = Piz; return hypre_error_flag; } /*-------------------------------------------------------------------------- * 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_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, *Gz_data; MPI_Comm comm = hypre_ParCSRMatrixComm(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; HYPRE_Int col_starts_size; 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)); HYPRE_BigInt *col_starts_G = hypre_ParCSRMatrixColStarts(G); #ifdef HYPRE_NO_GLOBAL_PARTITION col_starts_size = 2; #else HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); col_starts_size = num_procs+1; #endif col_starts = hypre_TAlloc(HYPRE_BigInt, col_starts_size, HYPRE_MEMORY_HOST); for (i = 0; i < col_starts_size; i++) col_starts[i] = (HYPRE_BigInt) dim * col_starts_G[i]; 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_ParCSRMatrixOwnsRowStarts(GPi) = 0; hypre_ParCSRMatrixOwnsColStarts(GPi) = 1; hypre_ParCSRMatrixInitialize(GPi); Gx_data = hypre_VectorData(hypre_ParVectorLocalVector(Gx)); Gy_data = hypre_VectorData(hypre_ParVectorLocalVector(Gy)); if (dim == 4) Gz_data = hypre_VectorData(hypre_ParVectorLocalVector(Gz)); /* 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); 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++ = fabs(G_diag_data[j]) * 0.5 * Gx_data[i]; *GPi_diag_data++ = fabs(G_diag_data[j]) * 0.5 * Gy_data[i]; if (dim == 4) *GPi_diag_data++ = fabs(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 (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++ = fabs(G_offd_data[j]) * 0.5 * Gx_data[i]; *GPi_offd_data++ = fabs(G_offd_data[j]) * 0.5 * Gy_data[i]; if (dim == 4) *GPi_offd_data++ = fabs(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 *--------------------------------------------------------------------------*/ HYPRE_Int hypre_AMSSetup(void *solver, hypre_ParCSRMatrix *A, hypre_ParVector *b, hypre_ParVector *x) { 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)); 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 */ 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 */ { hypre_ParCSRMatrix *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; for (i = 0; i < B_diag_i[B_num_rows]; i++) if (fabs(B_diag_data[i]) > lfactor) lfactor = fabs(B_diag_data[i]); for (i = 0; i < B_offd_i[B_num_rows]; i++) if (fabs(B_offd_data[i]) > lfactor) lfactor = fabs(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_ParcsrAdd(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 (fabs(dataB[i]) > lfactor) lfactor = fabs(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_ParCSRMatrixOwnsRowStarts(C) = 0; hypre_ParCSRMatrixOwnsColStarts(C) = 1; hypre_ParCSRMatrixOwnsColStarts(G0t) = 0; 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_ParCSRComputeL1Norms(ams_data -> A, ams_data -> A_relax_type, NULL, &ams_data -> A_l1_norms); /* 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 -> y != NULL && (ams_data -> dim == 2 || ams_data -> z != NULL)) input_info = 1; if (ams_data -> Gx != NULL && 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); 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); 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) { HYPRE_Int G_owned_col_starts; if (!hypre_ParCSRMatrixCommPkg(ams_data -> G)) hypre_MatvecCommPkgCreate(ams_data -> G); if (!hypre_ParCSRMatrixCommPkg(ams_data -> A)) hypre_MatvecCommPkgCreate(ams_data -> A); G_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ams_data -> G); 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); hypre_ParCSRMatrixOwnsColStarts(ams_data -> G) = G_owned_col_starts; hypre_ParCSRMatrixOwnsRowStarts(ams_data -> A_G) = 0; ams_data -> owns_A_G = 1; } HYPRE_BoomerAMGSetup(ams_data -> B_G, (HYPRE_ParCSRMatrix)ams_data -> A_G, 0, 0); } 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_Int P_owned_col_starts; 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); P_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ams_data -> Pix); hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pix, ams_data -> A, ams_data -> Pix, &ams_data -> A_Pix); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ams_data -> A_Pix) = 0; hypre_ParCSRMatrixOwnsColStarts(ams_data -> A_Pix) = 0; } /* 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, 0, 0); if (!hypre_ParCSRMatrixCommPkg(ams_data -> Piy)) hypre_MatvecCommPkgCreate(ams_data -> Piy); P_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ams_data -> Piy); hypre_BoomerAMGBuildCoarseOperator(ams_data -> Piy, ams_data -> A, ams_data -> Piy, &ams_data -> A_Piy); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ams_data -> A_Piy) = 0; hypre_ParCSRMatrixOwnsColStarts(ams_data -> A_Piy) = 0; } /* 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, 0, 0); if (ams_data -> Piz) { if (!hypre_ParCSRMatrixCommPkg(ams_data -> Piz)) hypre_MatvecCommPkgCreate(ams_data -> Piz); P_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ams_data -> Piz); hypre_BoomerAMGBuildCoarseOperator(ams_data -> Piz, ams_data -> A, ams_data -> Piz, &ams_data -> A_Piz); if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ams_data -> A_Piz) = 0; hypre_ParCSRMatrixOwnsColStarts(ams_data -> A_Piz) = 0; } /* 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, 0, 0); } } 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) { HYPRE_Int P_owned_col_starts = hypre_ParCSRMatrixOwnsColStarts(ams_data -> 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, *ApGGt; hypre_ParCSRMatrixTranspose(ams_data -> G, &Gt, 1); hypre_ParCSRMatrixOwnsColStarts(Gt) = 0; hypre_ParCSRMatrixOwnsRowStarts(Gt) = 0; /* 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)); 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); hypre_ParVectorDestroy(ams_data -> Gy); if (ams_data -> dim == 3) hypre_ParVectorDestroy(ams_data -> Gz); } GGt = hypre_ParMatmul(ams_data -> G, Gt); hypre_ParCSRMatrixDestroy(Gt); /* hypre_ParCSRMatrixAdd(GGt, A, &ams_data -> A); */ hypre_ParcsrAdd(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_ParCSRMatrixOwnsRowStarts(C) = 0; hypre_ParCSRMatrixOwnsColStarts(C) = 0; hypre_CSRMatrixDestroy(A_local); hypre_CSRMatrixDestroy(B_local); hypre_CSRMatrixDestroy(C_local); *C_ptr = C; }*/ hypre_ParCSRMatrixDestroy(GGt); hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pi, ApGGt, ams_data -> Pi, &ams_data -> A_Pi); } } else { hypre_BoomerAMGBuildCoarseOperator(ams_data -> Pi, ams_data -> A, ams_data -> Pi, &ams_data -> A_Pi); } if (!P_owned_col_starts) { hypre_ParCSRMatrixOwnsRowStarts(ams_data -> A_Pi) = 0; hypre_ParCSRMatrixOwnsColStarts(ams_data -> A_Pi) = 0; } 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, r_norm, b_norm, 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_ParVector *z = NULL; 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 (hypre_NumThreads() > 1 || ams_data -> A_relax_type == 16) { z = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(z); hypre_ParVectorSetPartitioningOwner(z,0); } 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 = sqrt(hypre_ParVectorInnerProd(ams_data -> r0,ams_data -> r0)); r0_norm = r_norm; b_norm = 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, 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 = 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", 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); if (z) hypre_ParVectorDestroy(z); 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_Int part_size; HYPRE_BigInt *row_starts, *col_starts; 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; /* Copy partitioning from A and x_coord (previously they were re-used) */ #ifdef HYPRE_NO_GLOBAL_PARTITION part_size = 2; #else hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &part_size); part_size++; #endif row_starts = hypre_TAlloc(HYPRE_BigInt, part_size, HYPRE_MEMORY_HOST); col_starts = hypre_TAlloc(HYPRE_BigInt, part_size, HYPRE_MEMORY_HOST); for (i = 0; i < part_size; i++) { row_starts[i] = hypre_ParCSRMatrixRowStarts(A)[i]; col_starts[i] = hypre_ParVectorPartitioning(x_coord)[i]; } /* Generate the discrete gradient matrix */ G = hypre_ParCSRMatrixCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParVectorGlobalSize(x_coord), row_starts, col_starts, 0, 0, 0); hypre_ParCSRMatrixOwnsRowStarts(G) = 1; hypre_ParCSRMatrixOwnsColStarts(G) = 1; 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_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, 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION vert_part = hypre_TAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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); #else HYPRE_Int num_procs; hypre_MPI_Comm_size(comm, &num_procs); vert_part = hypre_TAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&big_local_vert, 1, HYPRE_MPI_BIG_INT, &vert_part[1], 1, HYPRE_MPI_BIG_INT, comm); vert_part[0] = 0; for (i = 0; i < num_procs; i++) vert_part[i+1] += vert_part[i]; num_global_vert = vert_part[num_procs]; #endif /* 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; hypre_ParVectorOwnsPartitioning(x_coord) = 0; 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; hypre_ParVectorOwnsPartitioning(y_coord) = 0; 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; hypre_ParVectorOwnsPartitioning(z_coord) = 0; 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_ParCSRMatrixOwnsRowStarts(G) = 0; hypre_ParCSRMatrixOwnsColStarts(G) = 1; 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; HYPRE_Real *l1_norm = hypre_CTAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_SHARED); 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] += fabs(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] += fabs(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] += fabs(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] += fabs(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] += fabs(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] += fabs(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] += fabs(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] += fabs(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 */ 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 = fabs(A_diag_data[j]); l1_norm[i] += fabs(A_diag_data[j]); } else l1_norm[i] += 0.5*fabs(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*fabs(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]])) { if (ii == i) { diag = fabs(A_diag_data[j]); l1_norm[i] += fabs(A_diag_data[j]); } else l1_norm[i] += 0.5*fabs(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*fabs(A_offd_data[j]); } } /* Truncate according to Remark 6.2 */ if (l1_norm[i] <= 4.0/3.0*diag) l1_norm[i] = diag; } } /* 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 (fabs(l1_norm[i]) < DBL_EPSILON) */ if (fabs(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_ParCSRRelaxThreads * 1 = l1-scaled Jacobi * 2 = l1-scaled block Gauss-Seidel/SSOR *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRRelaxThreads(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_ParVector *u, hypre_ParVector *Vtemp, hypre_ParVector *z) { 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; 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; HYPRE_Real *v_buf_data; HYPRE_Real *tmp_data; HYPRE_Int i, j; HYPRE_Int ii, jj; HYPRE_Int ns, ne, size, rest; HYPRE_Int relax_error = 0; HYPRE_Int num_sends; HYPRE_Int index, start; HYPRE_Int num_procs, num_threads, my_id; HYPRE_Real zero = 0.0; HYPRE_Real res, res2; hypre_MPI_Comm_size(comm,&num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); /* only allow jacobi and GS */ if (relax_type > 2) relax_type = 2; /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } if (relax_type == 1) /* Jacobi */ { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += (relax_weight*res)/l1_norms[i]; } } } else if (relax_type == 2) /* GS */ { if (relax_weight == 1 && omega == 1) { tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if (A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else { HYPRE_Real c1 = omega*relax_weight; HYPRE_Real c2 = omega*(1.0-relax_weight); tmp_data = hypre_CTAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if (A_diag_data[A_diag_i[i]] != zero) { res2 = 0.0; res = f_data[i]; Vtemp_data[i] = u_data[i]; for (jj = A_diag_i[i]; 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]; if (ii < i) res2 += A_diag_data[jj] * (Vtemp_data[ii] - u_data[ii]); } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += (c1*res + c2*res2) / l1_norms[i]; } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if (A_diag_data[A_diag_i[i]] != zero) { res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]; 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]; if (ii > i) res2 += A_diag_data[jj] * (Vtemp_data[ii] - u_data[ii]); } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += (c1*res + c2*res2) / l1_norms[i]; } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } } /* end of Jacobi or G.S. */ if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } return(relax_error); } hypre-2.18.2/src/parcsr_ls/ams.h000066400000000000000000000153711355566575400164770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Real *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; /* 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) /* 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) /* 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_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_AMSDataPoissonAlphaAMGStrengthThreshold(ams_data) ((ams_data)->B_Pi_theta) #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_AMSDataPoissonBetaAMGStrengthThreshold(ams_data) ((ams_data)->B_G_theta) /* 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) #endif hypre-2.18.2/src/parcsr_ls/aux_interp.c000066400000000000000000000615221355566575400200670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #include "hypre_hopscotch_hash.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_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_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_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; } /* sort for non-ordered arrays */ 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; } /* Auxilary function for hypre_ssort */ 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; } 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; } /* 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; } /* 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) { #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)) { Sop_j[j] = -hypre_UnorderedBigIntMapGet(&col_map_offd_inverse, big_i1) - 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; 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 = tmp_found[0]; min = 1; for (i=1; i < newoff; i++) { if (tmp_found[i] > ifound) { ifound = tmp_found[i]; tmp_found[min++] = ifound; } } 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); 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_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_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)]; } hypre_ParCSRCommHandle *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_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) // skip_fine_or_same_sign if we want to skip fine points in S and nnz with the same sign as diagonal in A { #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; /*---------------------------------------------------------------------- * 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); hypre_ParCSRCommHandle *comm_handle_s_idx; *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; } 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 i, index; 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; if (full_off_procNodes) P_marker = hypre_TAlloc(HYPRE_Int, full_off_procNodes, 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; #ifdef HYPRE_CONCURRENT_HOPSCOTCH /* 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 */ #pragma omp parallel for private(i,index) HYPRE_SMP_SCHEDULE for (i=0; i < P_offd_size; i++) { index = P_offd_j[i]; if(tmp_CF_marker_offd[index] >= 0) { P_marker[index] = 1; } } HYPRE_Int prefix_sum_workspace[hypre_NumThreads() + 1]; HYPRE_Int num_cols_P_offd = 0; #pragma omp parallel private(i) { 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); #pragma omp master { if (num_cols_P_offd) col_map_offd_P = hypre_TAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); } #pragma omp barrier 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 #pragma omp parallel for 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); } #pragma omp parallel for for(i = 0; i < P_offd_size; i++) P_offd_j[i] = P_marker[P_offd_j[i]]; #else /* HYPRE_CONCURRENT_HOPSCOTCH */ HYPRE_Int num_cols_P_offd = 0; HYPRE_Int j; 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; } } } if (num_cols_P_offd) { HYPRE_Int *tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_HOST); HYPRE_BigInt *tmp_marker = hypre_CTAlloc(HYPRE_BigInt, 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); 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++) tmp_marker[i] = col_map_offd_P[i]; /* Check if sort actually changed anything */ if(hypre_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(tmp_marker[P_offd_j[i]] == col_map_offd_P[j]) { P_offd_j[i] = j; j = num_cols_P_offd; } } hypre_TFree(tmp_marker, HYPRE_MEMORY_HOST); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_HOST); } #endif /* HYPRE_CONCURRENT_HOPSCOTCH */ 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; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RENUMBER_COLIDX] += hypre_MPI_Wtime(); #endif } hypre-2.18.2/src/parcsr_ls/aux_interp.h000066400000000000000000000036051355566575400200720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/block_tridiag.c000066400000000000000000000276531355566575400205150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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() { 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_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_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.18.2/src/parcsr_ls/block_tridiag.h000066400000000000000000000035631355566575400205140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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(); 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.18.2/src/parcsr_ls/csr_block_matrix.h000066400000000000000000000144611355566575400212430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/driver.c000066400000000000000000001460221355566575400172030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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/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.18.2/src/parcsr_ls/gen_redcs_mat.c000066400000000000000000000467731355566575400205160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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) { /* 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_Int **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_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, 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; 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, HYPRE_MEMORY_SHARED); A_seq_offd_i = hypre_CTAlloc(HYPRE_Int, size+1, HYPRE_MEMORY_SHARED); if (num_functions > 1) seq_dof_func = hypre_CTAlloc(HYPRE_Int, size, HYPRE_MEMORY_HOST); } 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 ( 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 ( 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, HYPRE_MEMORY_SHARED); A_seq_data = hypre_CTAlloc(HYPRE_Real, total_nnz, HYPRE_MEMORY_SHARED); } 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 = hypre_CTAlloc(HYPRE_BigInt, 2, 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_ParVectorOwnsPartitioning(F_seq) = 0; hypre_ParVectorOwnsPartitioning(U_seq) = 0; 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); } /* 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 0; } 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 0; } void hypre_merge_lists (HYPRE_Int *list1, HYPRE_Int* list2, hypre_int *np1, hypre_MPI_Datatype *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.18.2/src/parcsr_ls/headers000077500000000000000000000024661355566575400171100ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <<@ #include #include "HYPRE_parcsr_ls.h" #ifndef hypre_PARCSR_LS_HEADER #define hypre_PARCSR_LS_HEADER #include "_hypre_utilities.h" #include "krylov.h" #include "seq_mv.h" #include "_hypre_parcsr_mv.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 #=========================================================================== # Structures and prototypes #=========================================================================== ../utilities/protos [!F]*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/parcsr_ls/par_add_cycle.c000066400000000000000000001204061355566575400204570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int **CF_marker_array; 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_Real **l1_norms; HYPRE_Real alpha, beta; HYPRE_Real *u_data; HYPRE_Real *v_data; HYPRE_Real *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 /* 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++) { 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,*/ for (j=0; j < num_grid_sweeps[1]; j++) { hypre_BoomerAMGRelaxIF(A_array[fine_grid],F_array[fine_grid], CF_marker_array[fine_grid], rlx_down,rlx_order,1, relax_weight[fine_grid], omega[fine_grid], l1_norms[level], 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] / 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]); } } /* additive smoothing and solve coarse grid */ 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], 1.0, 1.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], U_array[fine_grid], Vtemp, Ztemp); } /* up cycle */ for (level = num_levels-1; level > 0; 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,*/ for (j=0; j < num_grid_sweeps[2]; j++) hypre_BoomerAMGRelaxIF(A_array[fine_grid],F_array[fine_grid], CF_marker_array[fine_grid], rlx_up,rlx_order,2, relax_weight[fine_grid], omega[fine_grid], l1_norms[fine_grid], U_array[fine_grid], Vtemp, Ztemp); else if (rlx_order) { 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_array[fine_grid], loc_relax_points[i], 1.0, l1_norms[fine_grid], 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], 1.0, 1.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]); } } 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; hypre_CSRMatrix *Atilde_offd; HYPRE_Real *Atilde_diag_data; HYPRE_Real *Atilde_offd_data; 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; HYPRE_Real *L_offd_data; HYPRE_Real *buf_data = NULL; HYPRE_Real *tmp_data; HYPRE_Real *x_data; HYPRE_Real *r_data; HYPRE_Real *l1_norms; HYPRE_Real *A_tmp_diag_data; HYPRE_Real *A_tmp_offd_data; HYPRE_Real *D_data = NULL; HYPRE_Real *D_data_offd = NULL; HYPRE_Int *L_diag_i; HYPRE_Int *L_diag_j; HYPRE_Int *L_offd_i; HYPRE_Int *L_offd_j; HYPRE_Int *Atilde_diag_i; HYPRE_Int *Atilde_diag_j; HYPRE_Int *Atilde_offd_i; HYPRE_Int *Atilde_offd_j; 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; HYPRE_Int *send_map_starts; 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_Real **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/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); L_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgNumRecvs(L_comm_pkg) = num_recvs_L; hypre_ParCSRCommPkgNumSends(L_comm_pkg) = num_sends_L; hypre_ParCSRCommPkgRecvProcs(L_comm_pkg) = L_recv_procs; hypre_ParCSRCommPkgSendProcs(L_comm_pkg) = L_send_procs; hypre_ParCSRCommPkgRecvVecStarts(L_comm_pkg) = L_recv_ptr; hypre_ParCSRCommPkgSendMapStarts(L_comm_pkg) = L_send_ptr; hypre_ParCSRCommPkgSendMapElmts(L_comm_pkg) = L_send_map_elmts; hypre_ParCSRCommPkgComm(L_comm_pkg) = comm; 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) { /*hypre_ParCSRCommPkg *A_comm_pkg = NULL; HYPRE_Int *A_recv_ptr = NULL; HYPRE_Int *A_send_ptr = NULL; HYPRE_Int *A_recv_procs = NULL; HYPRE_Int *A_send_procs = NULL; HYPRE_Int *A_send_map_elmts = NULL; A_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); A_recv_ptr = hypre_CTAlloc(HYPRE_Int, num_recvs+1, HYPRE_MEMORY_HOST); A_send_ptr = hypre_CTAlloc(HYPRE_Int, num_sends+1, HYPRE_MEMORY_HOST); A_recv_procs = hypre_CTAlloc(HYPRE_Int, num_recvs_L, HYPRE_MEMORY_HOST); A_send_procs = hypre_CTAlloc(HYPRE_Int, num_sends_L, HYPRE_MEMORY_HOST); A_send_map_elmts = hypre_CTAlloc(HYPRE_Int, L_send_ptr[num_sends_L], HYPRE_MEMORY_HOST); for (i=0; i 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_Real **l1_norms_ptr = NULL; HYPRE_Real *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/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.18.2/src/parcsr_ls/par_amg.c000066400000000000000000003326141355566575400173220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include "par_amg.h" #include #ifdef HYPRE_USING_DSUPERLU #include #include "superlu_ddefs.h" #endif /*-------------------------------------------------------------------------- * hypre_BoomerAMGCreate *--------------------------------------------------------------------------*/ void * hypre_BoomerAMGCreate() { hypre_ParAMGData *amg_data; /* setup params */ HYPRE_Int max_levels; HYPRE_Int max_coarse_size; HYPRE_Int min_coarse_size; 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 S_commpkg_switch; 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 nodal, nodal_levels, nodal_diag; 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; /* 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 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; /* 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}; /*----------------------------------------------------------------------- * Setup default values for parameters *-----------------------------------------------------------------------*/ /* setup params */ max_levels = 25; max_coarse_size = 9; min_coarse_size = 0; seq_threshold = 0; redundant = 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; S_commpkg_switch = 1.0; interp_type = 0; 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; nodal = 0; nodal_levels = max_levels; nodal_diag = 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; /* solve params */ min_iter = 0; max_iter = 20; fcycle = 0; cycle_type = 1; converge_type = 0; tol = 1.0e-7; 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; /* 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; HYPRE_ANNOTATION_BEGIN("BoomerAMG.create"); /*----------------------------------------------------------------------- * Create the hypre_ParAMGData structure and return *-----------------------------------------------------------------------*/ amg_data = hypre_CTAlloc(hypre_ParAMGData, 1, HYPRE_MEMORY_HOST); 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_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_BoomerAMGSetSCommPkgSwitch(amg_data, S_commpkg_switch); 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_BoomerAMGSetNodal(amg_data, nodal); hypre_BoomerAMGSetNodalLevels(amg_data, nodal_levels); hypre_BoomerAMGSetNodal(amg_data, nodal_diag); 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_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_ParAMGDataAMat(amg_data) = NULL; hypre_ParAMGDataAInv(amg_data) = NULL; hypre_ParAMGDataBVec(amg_data) = NULL; hypre_ParAMGDataCommInfo(amg_data) = NULL; hypre_ParAMGDataNonGalerkinTol(amg_data) = nongalerkin_tol; hypre_ParAMGDataNonGalTolArray(amg_data) = NULL; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_ParAMGDataRAP2(amg_data) = 1; hypre_ParAMGDataKeepTranspose(amg_data) = 1; hypre_ParAMGDataModularizedMatMat(amg_data) = 1; #else hypre_ParAMGDataRAP2(amg_data) = 0; hypre_ParAMGDataKeepTranspose(amg_data) = 0; hypre_ParAMGDataModularizedMatMat(amg_data) = 0; #endif /* information for preserving indices as coarse grid points */ hypre_ParAMGDataCPointKeepMarkerArray(amg_data) = NULL; hypre_ParAMGDataCPointKeepLevel(amg_data) = 0; hypre_ParAMGDataNumCPointKeep(amg_data) = 0; #ifdef HYPRE_USING_DSUPERLU hypre_ParAMGDataDSLUThreshold(amg_data) = 0; hypre_ParAMGDataDSLUSolver(amg_data) = NULL; #endif HYPRE_ANNOTATION_END("BoomerAMG.create"); return (void *) amg_data; } /*-------------------------------------------------------------------------- * hypre_BoomerAMGDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGDestroy( void *data ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) 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 i; HYPRE_Int *grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); HYPRE_ANNOTATION_BEGIN("BoomerAMG.destroy"); #ifdef HYPRE_USING_DSUPERLU if (hypre_ParAMGDataDSLUThreshold(amg_data) > 0) hypre_SLUDistDestroy(hypre_ParAMGDataDSLUSolver(amg_data)); #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_TFree(hypre_ParAMGDataDofFunc(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataDofFunc(amg_data) = NULL; } 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; } 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]); /* RL */ if (hypre_ParAMGDataRestriction(amg_data)) { if (hypre_ParAMGDataRArray(amg_data)[i-1]) { hypre_ParCSRMatrixDestroy(hypre_ParAMGDataRArray(amg_data)[i-1]); } } hypre_TFree(hypre_ParAMGDataCFMarkerArray(amg_data)[i-1], HYPRE_MEMORY_HOST); /* 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_ParAMGDataLambda(amg_data)) { 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); } if (hypre_ParAMGDataXtilde(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataXtilde(amg_data)); if (hypre_ParAMGDataRtilde(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataRtilde(amg_data)); if (hypre_ParAMGDataL1Norms(amg_data)) { for (i=0; i < num_levels; i++) if (hypre_ParAMGDataL1Norms(amg_data)[i]) hypre_TFree(hypre_ParAMGDataL1Norms(amg_data)[i], HYPRE_MEMORY_SHARED); 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++) if (hypre_ParAMGDataChebyDS(amg_data)[i]) hypre_TFree(hypre_ParAMGDataChebyDS(amg_data)[i], HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataChebyDS(amg_data), HYPRE_MEMORY_HOST); } if (hypre_ParAMGDataDinv(amg_data)) 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_TFree(hypre_ParAMGDataCFMarkerArray(amg_data)[0], HYPRE_MEMORY_HOST); } 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); if (hypre_ParAMGDataRtemp(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataRtemp(amg_data)); if (hypre_ParAMGDataPtemp(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataPtemp(amg_data)); if (hypre_ParAMGDataZtemp(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataZtemp(amg_data)); if (hypre_ParAMGDataDofFuncArray(amg_data)) { for (i=1; i < num_levels; i++) hypre_TFree(hypre_ParAMGDataDofFuncArray(amg_data)[i], HYPRE_MEMORY_HOST); 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) { for (i=0; i < smooth_num_levels; i++) { HYPRE_ParCSRPilutDestroy(smoother[i]); } } else if (hypre_ParAMGDataSmoothType(amg_data) == 8) { for (i=0; i < smooth_num_levels; i++) { HYPRE_ParCSRParaSailsDestroy(smoother[i]); } } else if (hypre_ParAMGDataSmoothType(amg_data) == 9) { for (i=0; i < smooth_num_levels; i++) { HYPRE_EuclidDestroy(smoother[i]); } } else if (hypre_ParAMGDataSmoothType(amg_data) == 6) { for (i=0; i < smooth_num_levels; i++) { HYPRE_SchwarzDestroy(smoother[i]); } } hypre_TFree(hypre_ParAMGDataSmoother(amg_data), HYPRE_MEMORY_HOST); } if ( hypre_ParAMGDataResidual(amg_data) ) { /* jfp: was... hypre_TFree( hypre_ParAMGDataResidual(amg_data) );*/ hypre_ParVectorDestroy( hypre_ParAMGDataResidual(amg_data) ); hypre_ParAMGDataResidual(amg_data) = NULL; } if (hypre_ParAMGInterpVecVariant(amg_data) > 0 && hypre_ParAMGNumInterpVectors(amg_data) > 0) { HYPRE_Int j; HYPRE_Int num_vecs = hypre_ParAMGNumInterpVectors(amg_data); hypre_ParVector **sm_vecs; HYPRE_Int 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); } if (amg) hypre_BoomerAMGDestroy(amg); if (hypre_ParAMGDataACoarse(amg_data)) hypre_ParCSRMatrixDestroy(hypre_ParAMGDataACoarse(amg_data)); if (hypre_ParAMGDataUCoarse(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataUCoarse(amg_data)); if (hypre_ParAMGDataFCoarse(amg_data)) hypre_ParVectorDestroy(hypre_ParAMGDataFCoarse(amg_data)); /* destroy Cpoint_keep data */ if (hypre_ParAMGDataCPointKeepMarkerArray(amg_data)) { for (i=0; i=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_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_BoomerAMGSetSCommPkgSwitch( void *data, HYPRE_Real S_commpkg_switch ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParAMGDataSCommPkgSwitch(amg_data) = S_commpkg_switch; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGGetSCommPkgSwitch( void *data, HYPRE_Real * S_commpkg_switch ) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; if (!amg_data) { hypre_error_in_arg(1); return hypre_error_flag; } *S_commpkg_switch = hypre_ParAMGDataSCommPkgSwitch(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; } /* 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_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; } /*-------------------------------------------------------------------------- * 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 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 > 4) { 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_TFree(hypre_ParAMGDataDofFunc(amg_data), HYPRE_MEMORY_HOST); 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_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_BoomerAMGSetCpointsToKeep(void *data, HYPRE_Int cpt_coarse_level, HYPRE_Int num_cpt_coarse, HYPRE_Int *cpt_coarse_index) { hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; HYPRE_Int **C_point_marker_array = NULL; HYPRE_Int *C_point_marker = NULL; HYPRE_Int cpt_level; HYPRE_Int i; if (!amg_data) { hypre_printf("Warning! AMG object empty!\n"); hypre_error_in_arg(1); return hypre_error_flag; } if (cpt_coarse_level < 0) { hypre_printf("Warning! cpt_coarse_level < 0 !\n"); hypre_error_in_arg(2); return hypre_error_flag; } if (num_cpt_coarse < 0) { hypre_printf("Warning! num_cpt_coarse < 0 !\n"); hypre_error_in_arg(2); return hypre_error_flag; } /* free data not previously destroyed */ if (hypre_ParAMGDataCPointKeepLevel(amg_data)) { for (i=0; i1 */ /* 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_Real *A_mat; HYPRE_Real *b_vec; HYPRE_Int *comm_info; /* 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; /* information for preserving indeces as coarse grid points */ HYPRE_Int C_point_coarse_level; HYPRE_Int num_C_point_marker; HYPRE_Int **C_point_marker_array; #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_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_ParAMGDataStrongThreshold(amg_data) \ ((amg_data)->strong_threshold) #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_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_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_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_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_ParAMGDataCPointMarkerArray(amg_data) ((amg_data)-> C_point_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_ParAMGDataMaxEigEst(amg_data) ((amg_data)->max_eig_est) #define hypre_ParAMGDataMinEigEst(amg_data) ((amg_data)->min_eig_est) #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_ParAMGDataChebyOrder(amg_data) ((amg_data)->cheby_order) #define hypre_ParAMGDataChebyFraction(amg_data) ((amg_data)->cheby_fraction) #define hypre_ParAMGDataChebyDS(amg_data) ((amg_data)->cheby_ds) #define hypre_ParAMGDataChebyCoefs(amg_data) ((amg_data)->cheby_coefs) /* 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_ParAMGDataAMat(amg_data) ((amg_data)->A_mat) #define hypre_ParAMGDataBVec(amg_data) ((amg_data)->b_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) /*indices for the dof which will keep coarsening to the coarse level */ #define hypre_ParAMGDataCPointKeepMarkerArray(amg_data) ((amg_data)-> C_point_marker_array) #define hypre_ParAMGDataCPointKeepLevel(amg_data) ((amg_data)-> C_point_keep_level) #define hypre_ParAMGDataNumCPointKeep(amg_data) ((amg_data)-> num_C_point_marker) #ifdef HYPRE_USING_DSUPERLU /* Parameters and data for SuperLU_Dist */ #define hypre_ParAMGDataDSLUThreshold(amg_data) ((amg_data)->dslu_threshold) #define hypre_ParAMGDataDSLUSolver(amg_data) ((amg_data)->dslu_solver) #endif #endif hypre-2.18.2/src/parcsr_ls/par_amg_setup.c000066400000000000000000004216031355566575400205370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #include "../parcsr_block_mv/par_csr_block_matrix.h" #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; /* Data Structure variables */ 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_Int **CF_marker_array; HYPRE_Int **dof_func_array; HYPRE_Int *dof_func; HYPRE_Int *col_offd_S_to_A, *col_offd_Sabs_to_A = NULL; HYPRE_Int *col_offd_SN_to_AN; HYPRE_Real *relax_weight; HYPRE_Real *omega; HYPRE_Real schwarz_relax_wt = 1; HYPRE_Real strong_threshold; 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 S_commpkg_switch; 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_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; /* Local variables */ HYPRE_Int *CF_marker; HYPRE_Int *CFN_marker; HYPRE_Int *CF2_marker; 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_Real **l1_norms = NULL; HYPRE_Real **cheby_ds = NULL; HYPRE_Real **cheby_coefs = NULL; HYPRE_Int old_num_levels, num_levels; HYPRE_Int level; HYPRE_Int local_size, i; 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 rest, tms, indx; HYPRE_Real size; 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,num_threads; HYPRE_Int *grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); HYPRE_Int num_functions = hypre_ParAMGDataNumFunctions(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_Int *coarse_dof_func = NULL; HYPRE_BigInt *coarse_pnts_global; HYPRE_BigInt *coarse_pnts_global1; HYPRE_Int num_cg_sweeps; HYPRE_Real *max_eig_est = NULL; HYPRE_Real *min_eig_est = NULL; HYPRE_Solver *smoother = NULL; 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 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 **C_point_marker_array; HYPRE_Int local_coarse_size; HYPRE_Int num_C_point_coarse = hypre_ParAMGDataNumCPointKeep(amg_data); HYPRE_Int *C_point_keep; HYPRE_Int *num_grid_sweeps = hypre_ParAMGDataNumGridSweeps(amg_data); HYPRE_Int ns = num_grid_sweeps[1]; HYPRE_Real wall_time; /* for debugging instrumentation */ HYPRE_Int add_end; #ifdef HYPRE_USING_DSUPERLU HYPRE_Int dslu_threshold = hypre_ParAMGDataDSLUThreshold(amg_data); #endif #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_UNIFIED_MEMORY) #if 0 if ( hypre_ParAMGDataPrintLevel(amg_data) > 3 ) { if (!hypre_ParCSRMatrixIsManaged(A)) { hypre_fprintf(stderr,"WARNING:: INVALID A in hypre_BoomerAMGSetup::Address %p\n",A); //exit(2); } else if(!hypre_ParVectorIsManaged(f)) { hypre_fprintf(stderr,"WARNING:: INVALID f in hypre_BoomerAMGSetup::Address %p\n",f); //exit(2); } else if (!hypre_ParVectorIsManaged(u)) { hypre_fprintf(stderr,"WARNING:: INVALID u in hypre_BoomerAMGSetup::Address %p\n",u); //exit(2); } } #endif #endif /*hypre_CSRMatrix *A_new;*/ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); /*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); dof_func = hypre_ParAMGDataDofFunc(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); 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); local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); 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); C_point_marker_array = hypre_ParAMGDataCPointKeepMarkerArray(amg_data); HYPRE_ANNOTATION_BEGIN("BoomerAMG.setup"); /* 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; if (my_id == 0) 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 systmes */ /* If the user has specified either a block interpolation or a block relaxation then we need to make sure the other has been choosen 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 num levels at some point */ if (grid_relax_type[0] >= 20) /* block relaxation choosen */ { 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 prvious 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; } if (dof_func_array[j]) { hypre_TFree(dof_func_array[j], HYPRE_MEMORY_HOST); 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_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_array[j] = NULL; } } /* Special case use of CF_marker_array when old_num_levels == 1 requires us to attempt this deallocation every time */ if (CF_marker_array[0]) { hypre_TFree(CF_marker_array[0], HYPRE_MEMORY_HOST); CF_marker_array[0] = NULL; } for (j = 1; j < old_num_levels-1; j++) { if (CF_marker_array[j]) { hypre_TFree(CF_marker_array[j], HYPRE_MEMORY_HOST); 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 (hypre_ParAMGDataAMat(amg_data)) { hypre_TFree(hypre_ParAMGDataAMat(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataAMat(amg_data) = NULL; } if (hypre_ParAMGDataAInv(amg_data)) { hypre_TFree(hypre_ParAMGDataAInv(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataAInv(amg_data) = NULL; } if (hypre_ParAMGDataBVec(amg_data)) { hypre_TFree(hypre_ParAMGDataBVec(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataBVec(amg_data) = NULL; } if (hypre_ParAMGDataCommInfo(amg_data)) { hypre_TFree(hypre_ParAMGDataCommInfo(amg_data), HYPRE_MEMORY_HOST); hypre_ParAMGDataCommInfo(amg_data) = NULL; } 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; } 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_ParAMGDataL1Norms(amg_data)) { for (i=0; i < old_num_levels; i++) if (hypre_ParAMGDataL1Norms(amg_data)[i]) hypre_TFree(hypre_ParAMGDataL1Norms(amg_data)[i], HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParAMGDataL1Norms(amg_data), HYPRE_MEMORY_HOST); } if (smooth_num_levels && smoother) { if (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) == 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); hypre_ParAMGDataSmoother(amg_data) = NULL; } 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_Int*, max_levels, HYPRE_MEMORY_HOST); if (dof_func_array == NULL) dof_func_array = hypre_CTAlloc(HYPRE_Int*, max_levels, HYPRE_MEMORY_HOST); if (num_functions > 1 && dof_func == NULL) { HYPRE_BigInt num_fun = (HYPRE_BigInt) num_functions; first_local_row = hypre_ParCSRMatrixFirstRowIndex(A); dof_func = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); rest = first_local_row-((first_local_row/num_fun)*num_fun); 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_size/num_functions; if (tms*num_functions+indx > local_size) tms--; for (j=0; j < tms; j++) { for (k=0; k < num_functions; k++) dof_func[indx++] = k; } k = 0; while (indx < local_size) dof_func[indx++] = k++; hypre_ParAMGDataDofFunc(amg_data) = dof_func; } A_array[0] = A; /* 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_ParAMGDataCPointKeepMarkerArray(amg_data) = C_point_marker_array; 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_ParVectorInitialize(Vtemp); hypre_ParVectorSetPartitioningOwner(Vtemp,0); hypre_ParAMGDataVtemp(amg_data) = Vtemp; if ( (smooth_num_levels > 0 && smooth_type > 9) || relax_weight[0] < 0 || omega[0] < 0 || hypre_ParAMGDataSchwarzRlxWeight(amg_data) < 0 ) { Ptemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Ptemp); hypre_ParVectorSetPartitioningOwner(Ptemp,0); hypre_ParAMGDataPtemp(amg_data) = Ptemp; Rtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Rtemp); hypre_ParVectorSetPartitioningOwner(Rtemp,0); 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 ) { Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Ztemp); hypre_ParVectorSetPartitioningOwner(Ztemp,0); hypre_ParAMGDataZtemp(amg_data) = Ztemp; } else if (grid_relax_type[0] == 16 || grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16) { /* Chebyshev */ Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Ztemp); hypre_ParVectorSetPartitioningOwner(Ztemp,0); hypre_ParAMGDataZtemp(amg_data) = Ztemp; } else if (num_threads > 1) { /* we need the temp Z vector for relaxation 3 and 6 now if we are * using threading */ for (j = 1; 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) { Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Ztemp); hypre_ParVectorSetPartitioningOwner(Ztemp,0); hypre_ParAMGDataZtemp(amg_data) = Ztemp; break; } } } 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; strong_threshold = hypre_ParAMGDataStrongThreshold(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); S_commpkg_switch = hypre_ParAMGDataSCommPkgSwitch(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_ParVectorInitialize(F_array[level]); hypre_ParVectorSetPartitioningOwner(F_array[level],0); U_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorInitialize(U_array[level]); hypre_ParVectorSetPartitioningOwner(U_array[level],0); } } /*------------------------------------------------------------- * Select coarse-grid points on 'level' : returns CF_marker * for the level. Returns strength matrix, S *--------------------------------------------------------------*/ 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; coarse_pnts_global = NULL; CF_marker = hypre_CTAlloc(HYPRE_Int, local_size , HYPRE_MEMORY_HOST); for (i=0; i < local_size ; i++) CF_marker[i] = 1; /* AB removed below - already allocated */ /* CF_marker_array = hypre_CTAlloc(HYPRE_Int*, 1);*/ CF_marker_array[level] = CF_marker; 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_array[level], 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); col_offd_S_to_A = NULL; col_offd_SN_to_AN = NULL; if (strong_threshold > S_commpkg_switch) { hypre_BoomerAMGCreateSCommPkg(AN, SN, &col_offd_SN_to_AN); } } else /* standard AMG or unknown approach */ { if (!useSabs) { hypre_BoomerAMGCreateS(A_array[level], strong_threshold, max_row_sum, num_functions, dof_func_array[level], &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); } col_offd_S_to_A = NULL; if (strong_threshold > S_commpkg_switch) { hypre_BoomerAMGCreateSCommPkg(A_array[level], S, &col_offd_S_to_A); } } /* for AIR, need absolute value SOC: use a different threshold */ if (restri_type) { HYPRE_Real strong_thresholdR; strong_thresholdR = hypre_ParAMGDataStrongThresholdR(amg_data); hypre_BoomerAMGCreateSabs(A_array[level], strong_thresholdR, 1.0, 1, NULL, &Sabs); col_offd_Sabs_to_A = NULL; if (strong_thresholdR > S_commpkg_switch) { hypre_BoomerAMGCreateSCommPkg(A_array[level], Sabs, &col_offd_Sabs_to_A); } } } else { hypre_BoomerAMGCreateSmoothDirs(amg_data, A_array[level], SmoothVecs, strong_threshold, num_functions, dof_func_array[level], &S); } /**** Do the appropriate coarsening ****/ if (nodal == 0) /* no nodal coarsening */ { if (coarsen_type == 6) hypre_BoomerAMGCoarsenFalgout(S, A_array[level], measure_type, debug_flag, &CF_marker); else if (coarsen_type == 7) hypre_BoomerAMGCoarsen(S, A_array[level], 2, debug_flag, &CF_marker); else if (coarsen_type == 8) hypre_BoomerAMGCoarsenPMIS(S, A_array[level], 0, debug_flag, &CF_marker); else if (coarsen_type == 9) hypre_BoomerAMGCoarsenPMIS(S, A_array[level], 2, debug_flag, &CF_marker); else if (coarsen_type == 10) hypre_BoomerAMGCoarsenHMIS(S, A_array[level], measure_type, debug_flag, &CF_marker); 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); } else if (coarsen_type == 98) hypre_BoomerAMGCoarsenCR1(A_array[level], &CF_marker, &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_array[level],&SCR); hypre_BoomerAMGCoarsenCR(A_array[level], &CF_marker, &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); } #if DEBUG else if (coarsen_type == 999) { /* RL_DEBUG: read C/F splitting from files */ /* read from file */ HYPRE_Int my_id; MPI_Comm comm = hypre_ParCSRMatrixComm(A_array[level]); hypre_MPI_Comm_rank(comm, &my_id); HYPRE_Int first_local_row = hypre_ParCSRMatrixFirstRowIndex(A_array[level]); HYPRE_Int local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[level])); char CFfile[256], line[1024]; hypre_sprintf(CFfile, "CF_%d.txt", level); hypre_printf("myid %d: level %d, read C/F from file %s, first_row %d, local_size %d\n", my_id, level, CFfile, first_local_row, local_size); CF_marker = hypre_CTAlloc(HYPRE_Int, local_size, HYPRE_MEMORY_HOST); FILE *fp; if ((fp = fopen(CFfile, "r")) == NULL) { hypre_printf("cannot open file %s\n", CFfile); exit(0); } HYPRE_Int i; for (i=0; i 0) { if (coarsen_type == 6) hypre_BoomerAMGCoarsenFalgout(SN, SN, measure_type, 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, 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, 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, CFN_marker, num_paths, coarse_pnts_global1, &S2); if (coarsen_type == 10) hypre_BoomerAMGCoarsenHMIS(S2, S2, measure_type+3, 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, 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, debug_flag, &CF2_marker); else hypre_BoomerAMGCoarsen(S2, S2, 0, debug_flag, &CF2_marker); hypre_ParCSRMatrixDestroy(S2); S2 = NULL; } else { col_offd_S_to_A = NULL; /* hypre_BoomerAMGCreateScalarCFS(A_array[level], SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); */ hypre_BoomerAMGCreateScalarCFS(SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); if (col_offd_SN_to_AN == NULL) { col_offd_S_to_A = NULL; } hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); hypre_TFree(col_offd_SN_to_AN, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(SN); SN = NULL; hypre_ParCSRMatrixDestroy(AN); AN = NULL; } } /**************************************************/ /*********Set the fixed index to CF_marker*********/ //num_C_point_coarse if (hypre_ParAMGDataCPointKeepLevel(amg_data) > 0) { if (block_mode) { hypre_printf("Keeping coarse nodes in block mode is not implemented\n"); } else if (level < hypre_ParAMGDataCPointKeepLevel(amg_data)) { C_point_keep = C_point_marker_array[level]; if (level < hypre_ParAMGDataCPointKeepLevel(amg_data)-1) C_point_marker_array[level+1] = hypre_CTAlloc(HYPRE_Int, num_C_point_coarse, HYPRE_MEMORY_HOST); for(j = 0;j < num_C_point_coarse;j++) { CF_marker[C_point_keep[j]] = 2; } local_coarse_size = 0; k = 0; for (j = 0; j < local_num_vars; j ++) { if (CF_marker[j] == 1) local_coarse_size++; if (CF_marker[j] == 2) { if (level < hypre_ParAMGDataCPointKeepLevel(amg_data)-1) C_point_marker_array[level+1][k++] = local_coarse_size; local_coarse_size++; CF_marker[j] = 1; } } } } /*****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 */ if (level >= agg_num_levels) { 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); } #ifdef HYPRE_NO_GLOBAL_PARTITION 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 coarse_size = coarse_pnts_global[num_procs]; #endif /* 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); hypre_TFree(coarse_pnts_global, 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_TFree(CF_marker_array[level], HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } coarse_size = fine_size; if (Sabs) { hypre_ParCSRMatrixDestroy(Sabs); Sabs = NULL; } hypre_TFree(col_offd_Sabs_to_A, HYPRE_MEMORY_HOST); 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_TFree(coarse_dof_func, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker, HYPRE_MEMORY_HOST); hypre_TFree(coarse_pnts_global, HYPRE_MEMORY_HOST); 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_TFree(col_offd_Sabs_to_A, HYPRE_MEMORY_HOST); break; } } /*****xxxxxxxxxxxxx changes for min_coarse_size end */ 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_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &P1); } else if (agg_interp_type == 2) { hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, 0, col_offd_S_to_A, &P1); } else if (agg_interp_type == 3) { hypre_BoomerAMGBuildExtInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &P1); } if (agg_interp_type == 4) { hypre_BoomerAMGCorrectCFMarker (CF_marker, local_num_vars, CFN_marker); hypre_TFree(coarse_pnts_global1, HYPRE_MEMORY_HOST); /*hypre_TFree(coarse_dof_func); coarse_dof_func = NULL;*/ hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker, &coarse_dof_func,&coarse_pnts_global); hypre_BoomerAMGBuildMultipass(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, agg_trunc_factor, agg_P_max_elmts, sep_weight, col_offd_S_to_A, &P); } else { hypre_BoomerAMGCorrectCFMarker2 (CF_marker, local_num_vars, CFN_marker); hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); /*hypre_TFree(coarse_dof_func); coarse_dof_func = NULL;*/ hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker, &coarse_dof_func,&coarse_pnts_global); /*if (num_functions > 1 && nodal > -1 && (!block_mode) ) dof_func_array[level+1] = coarse_dof_func;*/ hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); if (agg_interp_type == 1) { hypre_BoomerAMGBuildPartialExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &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_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, sep_weight, col_offd_S_to_A, &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_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &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); hypre_MatvecCommPkgCreate(P); hypre_ParCSRMatrixDestroy(P1); hypre_ParCSRMatrixOwnsColStarts(P2) = 0; hypre_ParCSRMatrixDestroy(P2); hypre_ParCSRMatrixOwnsColStarts(P) = 1; } } else if (nodal > 0) { if (agg_interp_type == 4) { hypre_BoomerAMGCorrectCFMarker (CFN_marker, local_num_vars/num_functions, CF2_marker); hypre_TFree(CF2_marker, HYPRE_MEMORY_HOST); hypre_TFree(coarse_pnts_global1, HYPRE_MEMORY_HOST); col_offd_S_to_A = NULL; /* hypre_BoomerAMGCreateScalarCFS(A_array[level],SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); */ hypre_BoomerAMGCreateScalarCFS(SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); if (col_offd_SN_to_AN == NULL) col_offd_S_to_A = NULL; hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker, &coarse_dof_func,&coarse_pnts_global); hypre_BoomerAMGBuildMultipass(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, agg_trunc_factor, agg_P_max_elmts, sep_weight, col_offd_S_to_A, &P); } else { col_offd_S_to_A = NULL; /* hypre_BoomerAMGCreateScalarCFS(A_array[level],SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S);*/ hypre_BoomerAMGCreateScalarCFS(SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); #ifdef HYPRE_NO_GLOBAL_PARTITION for (i=0; i < 2; i++) coarse_pnts_global1[i] *= num_functions; #else for (i=1; i < num_procs+1; i++) coarse_pnts_global1[i] *= num_functions; #endif if (col_offd_SN_to_AN == NULL) col_offd_S_to_A = NULL; if (agg_interp_type == 1) hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &P1); else if (agg_interp_type == 2) hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, 0, col_offd_S_to_A, &P1); else if (agg_interp_type == 3) hypre_BoomerAMGBuildExtInterp(A_array[level], CF_marker, S, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &P1); hypre_BoomerAMGCorrectCFMarker2 (CFN_marker, local_num_vars/num_functions, CF2_marker); hypre_TFree(CF2_marker, HYPRE_MEMORY_HOST); hypre_TFree(CF_marker, HYPRE_MEMORY_HOST); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); col_offd_S_to_A = NULL; CF_marker = NULL; CF2_marker = NULL; hypre_ParCSRMatrixDestroy(S); /* hypre_BoomerAMGCreateScalarCFS(A_array[level],SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); */ hypre_BoomerAMGCreateScalarCFS(SN, CFN_marker, col_offd_SN_to_AN, num_functions, nodal, 0, NULL, &CF_marker, &col_offd_S_to_A, &S); if (col_offd_SN_to_AN == NULL) col_offd_S_to_A = NULL; hypre_TFree(CFN_marker, HYPRE_MEMORY_HOST); hypre_BoomerAMGCoarseParms(comm, local_num_vars, num_functions, dof_func_array[level], CF_marker, &coarse_dof_func,&coarse_pnts_global); /*if (num_functions > 1 && nodal > -1 && (!block_mode) ) dof_func_array[level+1] = coarse_dof_func;*/ if (agg_interp_type == 1) hypre_BoomerAMGBuildPartialExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, coarse_pnts_global1, num_functions, dof_func_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &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_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, sep_weight, col_offd_S_to_A, &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_array[level], debug_flag, agg_P12_trunc_factor, agg_P12_max_elmts, col_offd_S_to_A, &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); hypre_MatvecCommPkgCreate(P); hypre_ParCSRMatrixDestroy(P1); hypre_ParCSRMatrixOwnsColStarts(P2) = 0; hypre_ParCSRMatrixDestroy(P2); hypre_ParCSRMatrixOwnsColStarts(P) = 1; } if (SN) { hypre_ParCSRMatrixDestroy(SN); } SN = NULL; if (AN) { hypre_ParCSRMatrixDestroy(AN); } AN = NULL; } #ifdef HYPRE_NO_GLOBAL_PARTITION 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 coarse_size = coarse_pnts_global[num_procs]; #endif } 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); } #ifdef HYPRE_NO_GLOBAL_PARTITION 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 coarse_size = coarse_pnts_global[num_procs]; #endif 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 !!! */ 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, col_offd_Sabs_to_A, &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, col_offd_Sabs_to_A, &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, col_offd_Sabs_to_A, &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; } hypre_TFree(col_offd_Sabs_to_A, HYPRE_MEMORY_HOST); } 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_array[level], debug_flag, trunc_factor, P_max_elmts, sep_weight, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } 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_array[level], 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_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 3) { hypre_BoomerAMGBuildDirInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 6) /*Extended+i classical interpolation */ { hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 14) /*Extended classical interpolation */ { hypre_BoomerAMGBuildExtInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } 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_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 12) /*FF interpolation */ { hypre_BoomerAMGBuildFFInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 13) /*FF1 interpolation */ { hypre_BoomerAMGBuildFF1Interp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 8) /*Standard interpolation */ { hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, sep_weight, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } else if (interp_type == 100) /* 1pt interpolation */ { hypre_BoomerAMGBuildInterpOnePnt(A_array[level], CF_marker, S, coarse_pnts_global, 1, NULL, debug_flag, col_offd_S_to_A, &P); hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); #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, col_offd_S_to_A, &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, col_offd_S_to_A, &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, col_offd_S_to_A, &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, col_offd_S_to_A, &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, col_offd_S_to_A, &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, col_offd_S_to_A, &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, col_offd_S_to_A, &P_block_array[level]); } #ifdef HYPRE_NO_GLOBAL_PARTITION /* 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; #endif /* 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_array[level],&S2); col_offd_S_to_A = NULL; 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_array[level], dbg_flg, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); break; case 18: hypre_BoomerAMGBuildStdInterp(A_array[level], CF_marker, S2, coarse_pnts_global, 1, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, 0, col_offd_S_to_A, &P); break; case 17: hypre_BoomerAMGBuildExtPIInterp(A_array[level], CF_marker, S2, coarse_pnts_global, 1, dof_func_array[level], debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &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_array[level], dbg_flg, trunc_factor, P_max_elmts, col_offd_S_to_A, &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_array[level], dbg_flg, trunc_factor, P_max_elmts, col_offd_S_to_A, &P); } hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } } } else { hypre_BoomerAMGBuildInterpGSMG(NULL, CF_marker, S, coarse_pnts_global, num_functions, dof_func_array[level], 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;*/ /* store the CF array */ CF_marker_array[level] = CF_marker; dof_func_array[level+1] = NULL; if (num_functions > 1 && nodal > -1 && (!block_mode) ) dof_func_array[level+1] = coarse_dof_func; } /* 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_TFree(CF_marker_array[level], HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } 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_TFree(CF_marker_array[level], HYPRE_MEMORY_HOST); hypre_ParVectorDestroy(F_array[level]); hypre_ParVectorDestroy(U_array[level]); } 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_array[level], 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], 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_array[level], &dof_func_array[level+1], interp_vec_variant, level, abs_q_trunc, expandp_weights, q_max, CF_marker_array[level], interp_vec_first_level); } else /* LN */ { hypre_BoomerAMG_LNExpandInterp( A_array[level], &P, coarse_pnts_global, &num_functions, dof_func_array[level], &dof_func_array[level+1], 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), HYPRE_MEMORY_SHARED); hypre_VectorSize(Vtemp_local) = local_P_sz; hypre_VectorData(Vtemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz, HYPRE_MEMORY_SHARED); if (Ztemp) { hypre_Vector* Ztemp_local = hypre_ParVectorLocalVector(Ztemp); hypre_TFree(hypre_VectorData(Ztemp_local), HYPRE_MEMORY_SHARED); hypre_VectorSize(Ztemp_local) = local_P_sz; hypre_VectorData(Ztemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz, HYPRE_MEMORY_SHARED); } if (Ptemp) { hypre_Vector* Ptemp_local = hypre_ParVectorLocalVector(Ptemp); hypre_TFree(hypre_VectorData(Ptemp_local), HYPRE_MEMORY_HOST); hypre_VectorSize(Ptemp_local) = local_P_sz; hypre_VectorData(Ptemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz, HYPRE_MEMORY_HOST); } if (Rtemp) { hypre_Vector* Rtemp_local = hypre_ParVectorLocalVector(Rtemp); hypre_TFree(hypre_VectorData(Rtemp_local), HYPRE_MEMORY_HOST); hypre_VectorSize(Rtemp_local) = local_P_sz; hypre_VectorData(Rtemp_local) = hypre_CTAlloc(HYPRE_Complex, local_P_sz, HYPRE_MEMORY_HOST); } } /*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_ParVectorSetPartitioningOwner(Vtemp,0); 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], CF_marker_array[level], &interp_vectors_array[level+1], expand_level, num_functions); } } /* end apply variant */ }/* end interp_vec_variant > 0 */ for (i=0; i < post_interp_type; i++) /* Improve on P with Jacobi interpolation */ hypre_BoomerAMGJacobiInterp( A_array[level], &P, S, num_functions, dof_func, CF_marker_array[level], level, jacobi_trunc_threshold, 0.5*jacobi_trunc_threshold ); if (!block_mode) { if (mult_addlvl > -1 && level >= mult_addlvl && level <= add_end) { HYPRE_Real *d_diag; 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];*/ d_diag = hypre_CTAlloc(HYPRE_Real, lvl_nrows, HYPRE_MEMORY_HOST); for (i=0; i < lvl_nrows; i++) { d_diag[i] = lvl_data[lvl_i[i]]*w_inv; } } else { if (num_threads == 1) { hypre_ParCSRComputeL1Norms(A_array[level], 1, NULL, &d_diag); } else { hypre_ParCSRComputeL1NormsThreads(A_array[level], 1, num_threads, NULL, &d_diag); } } if (ns == 1) { hypre_ParCSRMatrix *Q = NULL; if (hypre_ParAMGDataModularizedMatMat(amg_data)) { Q = hypre_ParCSRMatMat(A_array[level],P); hypre_ParCSRMatrixAminvDB(P,Q,d_diag,&P_array[level]); A_H = hypre_ParCSRTMatMat(P,Q); } else { Q = hypre_ParMatmul(A_array[level],P); hypre_ParCSRMatrixAminvDB(P,Q,d_diag,&P_array[level]); A_H = hypre_ParTMatmul(P,Q); } hypre_ParCSRMatrixRowStarts(A_H) = hypre_ParCSRMatrixColStarts(A_H); hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; hypre_ParCSRMatrixOwnsColStarts(P) = 0; if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /*hypre_ParCSRMatrixDestroy(P); */ if (add_rlx == 0) { hypre_TFree(d_diag, HYPRE_MEMORY_HOST); } else { hypre_TFree(d_diag, HYPRE_MEMORY_SHARED); } /* 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_array[level+1], S_commpkg_switch, CF_marker_array[level], /* nongalerk_tol, sym_collapse, lump_percent, beta );*/ nongalerk_tol_l, 1, 0.5, 1.0 ); hypre_ParCSRMatrixColStarts(P_array[level]) = hypre_ParCSRMatrixRowStarts(A_H); 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_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); } hypre_ParCSRMatrixRowStarts(A_H) = hypre_ParCSRMatrixColStarts(A_H); hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; hypre_ParCSRMatrixOwnsColStarts(P_array[level]) = 0; 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_array[level+1], S_commpkg_switch, 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_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); } hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; hypre_ParCSRMatrixOwnsColStarts(P_array[level]) = 0; 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 (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); SmoothVecs = NULL; 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 *--------------------------------------------------------------*/ 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); } hypre_ParCSRMatrixRowStarts(A_H) = hypre_ParCSRMatrixColStarts(A_H); hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; hypre_ParCSRMatrixOwnsColStarts(P_array[level]) = 0; 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_array[level+1], S_commpkg_switch, 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); } else { AP = hypre_ParMatmul(A_array[level], P_array[level]); A_H = hypre_ParMatmul(R_array[level], AP); } /* RL: XXX NEED TO CHECK THIS WITH UMY */ hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; /* P gives up her ColStarts */ hypre_ParCSRMatrixOwnsColStarts(P_array[level]) = 0; /* R gives up her RowStarts */ hypre_ParCSRMatrixOwnsRowStarts(R_array[level]) = 0; if (num_procs > 1) { hypre_MatvecCommPkgCreate(A_H); } /* Delete AP */ hypre_ParCSRMatrixDestroy(AP); #if DEBUG_SAVE_ALL_OPS if (level == 0) { hypre_ParCSRMatrixPrintIJ(A_array[0], 1, 1, "A_0.mtx"); } char file[256]; hypre_sprintf(file, "A_%d.mtx", level+1); hypre_ParCSRMatrixPrintIJ(A_H, 1, 1, file); #endif } 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); } hypre_ParCSRMatrixOwnsRowStarts(A_H) = 1; hypre_ParCSRMatrixOwnsColStarts(A_H) = 0; hypre_ParCSRMatrixOwnsColStarts(P_array[level]) = 0; 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_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); } ++level; 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); } if (hypre_ParAMGDataADropTol(amg_data) <= 0.0) { hypre_ParCSRMatrixSetNumNonzeros(A_H); hypre_ParCSRMatrixSetDNumNonzeros(A_H); } A_array[level] = A_H; } 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); #ifdef 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) */ /* 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); } #ifdef 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] == 99 || grid_relax_type[3] == 199) /*use of Gaussian elimination on 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]; } } else if (grid_relax_type[3] == 19 || grid_relax_type[3] == 98) /*use of Gaussian elimination on coarsest level */ { if (coarse_size > coarse_threshold) { grid_relax_type[3] = grid_relax_type[1]; } } 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_ParVectorInitialize(F_array[level]); hypre_ParVectorSetPartitioningOwner(F_array[level],0); U_array[level] = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorInitialize(U_array[level]); hypre_ParVectorSetPartitioningOwner(U_array[level],0); } } /*----------------------------------------------------------------------- * 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 *-----------------------------------------------------------------------*/ 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] == 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) { l1_norms = hypre_CTAlloc(HYPRE_Real *, num_levels, HYPRE_MEMORY_HOST); hypre_ParAMGDataL1Norms(amg_data) = l1_norms; } if (grid_relax_type[0] == 16 ||grid_relax_type[1] == 16 || grid_relax_type[2] == 16 || grid_relax_type[3] == 16) /* Chebyshev */ { 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_Real *, 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; } if (grid_relax_type[0] == 15 ||grid_relax_type[1] == 15 || grid_relax_type[2] == 15 || grid_relax_type[3] == 15) /* CG */ { 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++) { if (num_threads == 1) { 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, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norms[j]); } 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_norms[j]); } if ((grid_relax_type[1] == 18 || grid_relax_type[2] == 18) && j < num_levels-1) { if (relax_order) hypre_ParCSRComputeL1Norms(A_array[j], 1, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); } else if (grid_relax_type[3] == 18 && j == num_levels-1) { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); } } else { 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_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, CF_marker_array[j] , &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, NULL, &l1_norms[j]); } else if ((grid_relax_type[3] == 8 || grid_relax_type[3] == 13 || grid_relax_type[3] == 14) && j == num_levels-1) { hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, NULL, &l1_norms[j]); } if ((grid_relax_type[1] == 18 || grid_relax_type[2] == 18) && j < num_levels-1) { if (relax_order) hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } else if (grid_relax_type[3] == 18 && j == num_levels-1) { hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } } } for (j = addlvl; j < hypre_min(add_end+1, num_levels) ; j++) { if (add_rlx == 18 ) { if (num_threads == 1) hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } } for (j = add_end+1; j < num_levels; j++) { if (num_threads == 1) { 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, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norms[j]); } 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_norms[j]); } if ((grid_relax_type[1] == 18 || grid_relax_type[2] == 18) && j < num_levels-1) { if (relax_order) hypre_ParCSRComputeL1Norms(A_array[j], 1, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); } else if (grid_relax_type[3] == 18 && j == num_levels-1) { hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); } } else { 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_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, CF_marker_array[j] , &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, NULL, &l1_norms[j]); } else if ((grid_relax_type[3] == 8 || grid_relax_type[3] == 13 || grid_relax_type[3] == 14) && j == num_levels-1) { hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, NULL, &l1_norms[j]); } if ((grid_relax_type[1] == 18 || grid_relax_type[2] == 18) && j < num_levels-1) { if (relax_order) hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } else if (grid_relax_type[3] == 18 && j == num_levels-1) { hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } } } for (j = 0; j < num_levels; j++) { if (grid_relax_type[1] == 7 || grid_relax_type[2] == 7 || (grid_relax_type[3] == 7 && j== (num_levels-1))) { hypre_ParCSRComputeL1Norms(A_array[j], 5, NULL, &l1_norms[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); HYPRE_Int variant = hypre_ParAMGDataChebyVariant(amg_data); HYPRE_Real max_eig, min_eig = 0; HYPRE_Real *coefs = NULL; HYPRE_Real *ds = 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); max_eig_est[j] = max_eig; min_eig_est[j] = min_eig; hypre_ParCSRRelax_Cheby_Setup(A_array[j],max_eig, min_eig, cheby_fraction, cheby_order, scale, variant, &coefs, &ds); cheby_coefs[j] = coefs; cheby_ds[j] = ds; } 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) { 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) { #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Euclid smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif 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 == 8 || smooth_type == 18) && smooth_num_levels > j) { #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC,"ParaSails smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif 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) { #ifdef HYPRE_MIXEDINT hypre_error_w_msg(HYPRE_ERROR_GENERIC,"pilut smoothing is not available in mixedint mode!"); return hypre_error_flag; #endif 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]); } } } /* end of levels loop */ 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(Residual_array); hypre_ParVectorSetPartitioningOwner(Residual_array,0); 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); } /*----------------------------------------------------------------------- * Print some stuff *-----------------------------------------------------------------------*/ if (amg_print_level == 1 || amg_print_level == 3) hypre_BoomerAMGSetupStats(amg_data,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])); } for (i = 0, j = 0; i < local_size; i++) { /* if a C-point */ CF[i] = 0; if (CF_marker_array[level][i] > -1) { CF[i] = CFc[j] + 1; j++; } } } 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 ",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); hypre_ParVectorSetPartitioningOwner(u_vec,0); f_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[level]), hypre_ParCSRMatrixGlobalNumRows(A_array[level]), hypre_ParCSRMatrixRowStarts(A_array[level])); hypre_ParVectorInitialize(f_vec); hypre_ParVectorSetPartitioningOwner(f_vec,0); 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 = 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_ANNOTATION_END("BoomerAMG.setup"); return(hypre_error_flag); } hypre-2.18.2/src/parcsr_ls/par_amg_solve.c000066400000000000000000000316431355566575400205300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 num_unknowns; */ HYPRE_Int converge_type; HYPRE_Real tol; HYPRE_Int block_mode; 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 min_iter; HYPRE_Int max_iter; HYPRE_Int num_procs, my_id; HYPRE_Int additive; HYPRE_Int mult_additive; HYPRE_Int simple; 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 *Residual; HYPRE_ANNOTATION_BEGIN("BoomerAMG.solve"); 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); 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); A_array[0] = A; F_array[0] = f; U_array[0] = u; block_mode = hypre_ParAMGDataBlockMode(amg_data); A_block_array = hypre_ParAMGDataABlockArray(amg_data); /* Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Vtemp); hypre_ParVectorSetPartitioningOwner(Vtemp,0); hypre_ParAMGDataVtemp(amg_data) = Vtemp; */ Vtemp = hypre_ParAMGDataVtemp(amg_data); /*----------------------------------------------------------------------- * 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 = 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 = sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } /* Since it is 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_ANNOTATION_END("BoomerAMG.solve"); return hypre_error_flag; } /* r0 */ resid_nrm_init = resid_nrm; if (0 == converge_type) { rhs_norm = 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 { 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 = sqrt(hypre_ParVectorInnerProd( Residual, Residual )); } else { hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], Vtemp); resid_nrm = 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 = 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;j1 ) 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_ANNOTATION_BEGIN("BoomerAMG.solveT"); /* Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0])); hypre_ParVectorInitialize(Vtemp); hypre_ParVectorSetPartitioningOwner(Vtemp,0); 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 = 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 = sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } resid_nrm_init = resid_nrm; rhs_norm = 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 = 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 = 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 = pow((resid_nrm/resid_nrm_init),(1.0/((HYPRE_Real) cycle_count))); for (j=0;j 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_ANNOTATION_END("BoomerAMG.solveT"); 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_Int **CF_marker_array; /* 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; 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_ANNOTATION_BEGIN("BoomerAMG.cycleT"); /* 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 *--------------------------------------------------------------------*/ 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" */ Solve_err_flag = hypre_BoomerAMGRelaxT(A_array[level], F_array[level], CF_marker_array[level], 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_ANNOTATION_END("BoomerAMG.cycleT"); 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]); ++level; lev_counter[level] = hypre_max(lev_counter[level],cycle_type); cycle_param = 1; if (level == num_levels-1) cycle_param = 3; } 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]); --level; cycle_param = 2; if (level == 0) cycle_param = 0; } else { Not_Finished = 0; } } hypre_ParAMGDataCycleOpCount(amg_data) = cycle_op_count; hypre_TFree(lev_counter, HYPRE_MEMORY_HOST); hypre_TFree(num_coeffs, HYPRE_MEMORY_HOST); HYPRE_ANNOTATION_END("BoomerAMG.cycleT"); 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_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_ANNOTATION_BEGIN("BoomerAMG.relaxT"); /*----------------------------------------------------------------------- * 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 *-----------------------------------------------------------------*/ if (n) { A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); 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_ANNOTATION_END("BoomerAMG.relaxT"); return(relax_error); } hypre-2.18.2/src/parcsr_ls/par_cg_relax_wt.c000066400000000000000000000310051355566575400210420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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; /* 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; hypre_ParVector *Vtemp; hypre_ParVector *Ptemp; hypre_ParVector *Rtemp; hypre_ParVector *Ztemp; hypre_ParVector *Qtemp = NULL; HYPRE_Int *CF_marker = hypre_ParAMGDataCFMarkerArray(amg_data)[level]; 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_Real *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 HYPRE_Int num_threads; num_threads = hypre_NumThreads(); /* 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); hypre_ParVectorSetPartitioningOwner(Rtemp,0); Ptemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ptemp); hypre_ParVectorSetPartitioningOwner(Ptemp,0); Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ztemp); hypre_ParVectorSetPartitioningOwner(Ztemp,0); if (hypre_ParAMGDataL1Norms(amg_data) != NULL) l1_norms = hypre_ParAMGDataL1Norms(amg_data)[level]; if (num_threads > 1) { Qtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Qtemp); hypre_ParVectorSetPartitioningOwner(Qtemp,0); } grid_relax_type = hypre_ParAMGDataGridRelaxType(amg_data); smooth_type = hypre_ParAMGDataSmoothType(amg_data); smooth_num_levels = hypre_ParAMGDataSmoothNumLevels(amg_data); /* 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_ParVectorOwnsPartitioning(Utemp) = 0; 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); /*------------------------------------------------------------------ * 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_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, 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); alphinv = 1.0/alpha; tridiag[jj+1] = alphinv; tridiag[jj] *= beta; tridiag[jj] += alphinv; trioffd[jj] *= sqrt(beta); trioffd[jj+1] = -alphinv; row_sum = fabs(tridiag[jj]) + fabs(trioffd[jj]); if (row_sum > max_row_sum) max_row_sum = row_sum; if (jj > 0) { row_sum = fabs(tridiag[jj-1]) + fabs(trioffd[jj-1]) + fabs(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 (fabs(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 = fabs(tridiag[0])+fabs(trioffd[1]); for (i=1; i < num_cg_sweeps-1; i++) { row_sum = fabs(tridiag[i]) + fabs(trioffd[i]) + fabs(trioffd[i+1]); if (row_sum > rlx_wt) rlx_wt = row_sum; } row_sum = fabs(tridiag[num_cg_sweeps-1]) + fabs(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 (num_threads > 1) 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 (fabs(y-z) > tol*(fabs(y) + fabs(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.18.2/src/parcsr_ls/par_cgc_coarsen.c000066400000000000000000001377771355566575400210410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 */ #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_Int **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; 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; HYPRE_Int measure_max; /* 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 * *************************************************************/ CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); 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;jS_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]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 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); *CF_marker_ptr = CF_marker; 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 #ifdef HYPRE_NO_GLOBAL_PARTITION { /* classical CGC does not really make sense in combination with HYPRE_NO_GLOBAL_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]; } #else vertexrange_all = vertexrange; #endif 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;j0) CF_marker[i]+=vstart; } else { /* hypre_printf ("processor %d: empty grid allowed\n",mpirank); */ for (i=0;i0) 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;i1) { 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_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) /* 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 i,/* ii,ip,*/ j,jj,m,n,p; HYPRE_Int mpisize,mpirank; HYPRE_Real weight; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION { 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= 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= 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;mlocal/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 = -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; else weight = -8; /* F-F-coupling */ HYPRE_IJMatrixAddToValues (ijmatrix,1,&one,&big_m,&big_n,&weight); /*#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); /*} */ *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;ihead]) { 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]];ihead; 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 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; /* 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 - pow(delta,3) + 2*pow(theta,3); coefs[0] = (4*delta*theta - pow(delta,2) + 6*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*pow(theta,3) - 3*pow(delta,2)*pow(theta,2) - 3*pow(delta,3)*theta + 4*pow(theta,4) ); coefs[0] = (6*pow(delta,2)*theta - 12*delta*pow(theta,2) + 3*pow(delta,3) - 16*pow(theta,3) )/den; coefs[1] = (12*delta*theta - 3*pow(delta,2) + 24*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 = pow(delta,4) - 8*delta*delta*theta*theta + 8*pow(theta,4); coefs[0] = (32*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/sqrt(diagonal) */ ds_data = hypre_CTAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j,diag) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_rows; j++) { diag = A_diag_data[A_diag_i[j]]; ds_data[j] = 1/sqrt(diag); } }/* end of scaling code */ *ds_ptr = ds_data; return hypre_error_flag; } 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_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; hypre_ParVector *tmp_vec; /* 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; orig_u = hypre_CTAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_HOST); if (!scale) { /* get residual: r = f - A*u */ hypre_ParVectorCopy(f, r); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); 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]; #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]; } } #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/sqrt(diagonal) */ tmp_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(tmp_vec); hypre_ParVectorSetPartitioningOwner(tmp_vec,0); 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); #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.*/ #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 */ #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]; #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*/ #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]; } hypre_ParVectorDestroy(tmp_vec); }/* end of scaling code */ hypre_TFree(orig_u, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_coarse_parms.c000066400000000000000000000077461355566575400212410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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_ptr [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_BoomerAMGCoarseParms(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) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] -= hypre_MPI_Wtime(); #endif HYPRE_Int i; HYPRE_Int ierr = 0; HYPRE_Int num_procs; HYPRE_BigInt local_coarse_size = 0; HYPRE_Int *coarse_dof_func; HYPRE_BigInt *coarse_pnts_global; /*-------------------------------------------------------------- *----------------------------------------------------------------*/ hypre_MPI_Comm_size(comm,&num_procs); for (i=0; i < local_num_variables; i++) { if (CF_marker[i] == 1) local_coarse_size++; } if (num_functions > 1) { coarse_dof_func = hypre_CTAlloc(HYPRE_Int, local_coarse_size, HYPRE_MEMORY_HOST); local_coarse_size = 0; for (i=0; i < local_num_variables; i++) { if (CF_marker[i] == 1) coarse_dof_func[local_coarse_size++] = dof_func[i]; } *coarse_dof_func_ptr = coarse_dof_func; } #ifdef HYPRE_NO_GLOBAL_PARTITION { HYPRE_BigInt scan_recv; coarse_pnts_global = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; } #else coarse_pnts_global = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&local_coarse_size,1,HYPRE_MPI_BIG_INT,&coarse_pnts_global[1], 1,HYPRE_MPI_BIG_INT,comm); for (i=2; i < num_procs+1; i++) coarse_pnts_global[i] += coarse_pnts_global[i-1]; #endif *coarse_pnts_global_ptr = coarse_pnts_global; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_COARSE_PARAMS] += hypre_MPI_Wtime(); #endif return (ierr); } hypre-2.18.2/src/parcsr_ls/par_coarsen.c000066400000000000000000002534031355566575400202060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 [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_Int **CF_marker_ptr) { 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_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; HYPRE_Int use_commpkg_A = 0; HYPRE_Int break_var = 1; HYPRE_Real wall_time; 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; if (CF_init==1) { CF_marker = *CF_marker_ptr; 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] == 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 if (CF_marker[i] == SF_PT) measure_array[i] = 0; else graph_array[cnt++] = i; } } else { CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); cnt = 0; for (i=0; i < num_variables; i++) { CF_marker[i] = 0; if ( (S_diag_i[i+1]-S_diag_i[i]) == 0 && (S_offd_i[i+1]-S_offd_i[i]) == 0) { CF_marker[i] = SF_PT; measure_array[i] = 0; } else graph_array[cnt++] = i; } } 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); *CF_marker_ptr = CF_marker; 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 debug_flag, HYPRE_Int **CF_marker_ptr) { 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 = 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_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 num_nonzeros; 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; 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 * *************************************************************/ CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); 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; if (agg_2) { CF_marker[j] = SC_PT; } measure_array[j] = 0; } else { CF_marker[j] = UNDECIDED; num_left++; } } 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"); } /*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] != 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) { *CF_marker_ptr = CF_marker; 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); } *CF_marker_ptr = CF_marker; return hypre_error_flag; } HYPRE_Int hypre_BoomerAMGCoarsenFalgout( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int **CF_marker_ptr) { HYPRE_Int ierr = 0; /*------------------------------------------------------- * Perform Ruge coarsening followed by CLJP coarsening *-------------------------------------------------------*/ ierr += hypre_BoomerAMGCoarsenRuge (S, A, measure_type, 6, 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_Int **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; 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_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 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); if (CF_init == 1) { CF_marker = *CF_marker_ptr; 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] == 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 if (CF_marker[i] == SF_PT) { measure_array[i] = 0; } else { graph_array[cnt++] = i; } } } else { CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); cnt = 0; for (i = 0; i < num_variables; i++) { CF_marker[i] = 0; if ( S_diag_i[i+1] - S_diag_i[i] == 0 && S_offd_i[i+1] - S_offd_i[i] == 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);*/ *CF_marker_ptr = CF_marker; #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_Int **CF_marker_ptr) { #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); #endif HYPRE_Int exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(A)) ); hypre_assert(exec != HYPRE_EXEC_UNSET); HYPRE_Int ierr = 0; if (exec == HYPRE_EXEC_HOST) { /* printf(" coarsen PMIS Host \n");*/ ierr = hypre_BoomerAMGCoarsenPMISHost( S, A, CF_init, debug_flag, CF_marker_ptr ); } #if defined(HYPRE_USING_CUDA) else { /* printf(" coarsen PMIS Device \n");*/ ierr = hypre_BoomerAMGCoarsenPMISDevice( S, A, CF_init, debug_flag, CF_marker_ptr ); } #endif #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif return ierr; } HYPRE_Int hypre_BoomerAMGCoarsenHMIS( hypre_ParCSRMatrix *S, hypre_ParCSRMatrix *A, HYPRE_Int measure_type, HYPRE_Int debug_flag, HYPRE_Int **CF_marker_ptr) { HYPRE_Int ierr = 0; /*------------------------------------------------------- * Perform Ruge coarsening followed by CLJP coarsening *-------------------------------------------------------*/ ierr += hypre_BoomerAMGCoarsenRuge (S, A, measure_type, 10, debug_flag, CF_marker_ptr); ierr += hypre_BoomerAMGCoarsenPMISHost (S, A, 1, debug_flag, CF_marker_ptr); return (ierr); } hypre-2.18.2/src/parcsr_ls/par_coarsen_device.c000066400000000000000000000505771355566575400215340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #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_CUDA) 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_Int **CF_marker_ptr ) { 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 ierr = 0; HYPRE_Int iter = 0; void *send_buf; HYPRE_Int my_id, num_procs; #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 */ CF_marker_diag = hypre_TAlloc(HYPRE_Int, num_cols_diag, HYPRE_MEMORY_DEVICE); // CF_marker_diag = hypre_TAlloc(HYPRE_Int, num_cols_diag, HYPRE_MEMORY_SHARED); 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 *-------------------------------------------------------------------*/ hypre_GetGlobalMeasureDevice(S, comm_pkg, CF_init, 2, 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 || 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 */ 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 ); 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 is NOT sync'ed */ 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 */ 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()); graph_diag_size = new_end - graph_diag; } /*--------------------------------------------------- * Clean up and return *---------------------------------------------------*/ *CF_marker_ptr = hypre_CTAlloc(HYPRE_Int, num_cols_diag, HYPRE_MEMORY_HOST); hypre_TMemcpy( *CF_marker_ptr, CF_marker_diag, HYPRE_Int, num_cols_diag, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE ); hypre_TFree(CF_marker_diag,HYPRE_MEMORY_DEVICE); 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); // *CF_marker_ptr = CF_marker_diag; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PMIS] += hypre_MPI_Wtime(); #endif return ierr; } 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_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); /* 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 */ 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); } hypreDevice_GenScatterAdd(measure_diag, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), real_send_buf); /* 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 hypreCUDAKernel_PMISCoarseningInit(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_cuda_get_grid_thread_id<1,1>(); if (i >= nrows) { return; } /*--------------------------------------------- * 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 ( measure_diag[i] < 1.0 ) { CF_marker_diag[i] = F_PT; measure_diag[i] = 0.0; return; } if (CF_init == 1) { // TODO } else { if ( S_diag_i[i+1] - S_diag_i[i] == 0 && S_offd_i[i+1] - S_offd_i[i] == 0 ) { HYPRE_Int mark = (CF_init == 3 || CF_init == 4) ? C_PT : SF_PT; CF_marker_diag[i] = mark; measure_diag[i] = 0.0; } else { CF_marker_diag[i] = 0; } } } 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, gDim; bDim = hypre_GetDefaultCUDABlockDimension(); gDim = hypre_GetDefaultCUDAGridDimension(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_CUDA_LAUNCH( hypreCUDAKernel_PMISCoarseningInit, gDim, bDim, num_rows_diag, CF_init, S_diag_i, S_offd_i, measure_diag, CF_marker_diag ); /* communicate for measure_offd */ HYPRE_THRUST_CALL(gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf); 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 */ 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()); *graph_diag_size = new_end - graph_diag; return hypre_error_flag; } __global__ void hypreCUDAKernel_PMISCoarseningUpdateCF(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_cuda_get_grid_warp_id<1,1>(); if (warp_id >= graph_diag_size) { return; } HYPRE_Int lane = hypre_cuda_get_lane_id<1>(); HYPRE_Int row, i, 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 = __shfl_sync(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 { 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 i; if * j is a C point, then make i an F point. *-------------------------------------------------*/ if (lane < 2) { i = read_only_load(S_diag_i + row + lane); } row_start = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 0); row_end = __shfl_sync(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(marker_row); if (marker_row == 0) { if (lane < 2) { i = read_only_load(S_offd_i + row + lane); } row_start = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 0); row_end = __shfl_sync(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(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_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, gDim; bDim = hypre_GetDefaultCUDABlockDimension(); gDim = hypre_GetDefaultCUDAGridDimension(graph_diag_size, "warp", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_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 */ HYPRE_THRUST_CALL(gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), measure_diag, real_send_buf); 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); 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_CUDA) /* cudaError_t cudaerr = cudaGetLastError(); if (cudaerr != cudaSuccess) { hypre_printf("CUDA error: %s\n",cudaGetErrorString(cudaerr)); } exit(0); */ hypre-2.18.2/src/parcsr_ls/par_coordinates.c000066400000000000000000000041261355566575400210620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * GenerateCoordinates *--------------------------------------------------------------------------*/ float * 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_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.18.2/src/parcsr_ls/par_cr.c000066400000000000000000003003721355566575400171560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int **CF_marker_ptr, HYPRE_BigInt *coarse_size_ptr, HYPRE_Int num_CR_relax_steps, HYPRE_Int IS_type, HYPRE_Int CRaddCpoints) { 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 = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for ( i = 0; i < num_variables; i++) CF_marker[i] = fpt; } else { CF_marker = *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++; } } *CF_marker_ptr = CF_marker; *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 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= 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; } } } free(ma); free(list); free(head_mem); free(tail_mem); 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; } } } free(ma); free(list); free(head_mem); free(tail_mem); 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 max) max = fabs(e1[i]); for (i=0;i 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; 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; 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_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_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; 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; HYPRE_Int iter = 0; #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); } } iter++; /*------------------------------------------------ * 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_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); } } iter++; /*------------------------------------------------ * 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); hypre_ParVectorSetPartitioningOwner(Relax_temp,0); } 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= 0.1*theta && (i < num_CR_relax_steps || relrho >= 0.1)) /*for (i=0;i theta) { if (useCG) { for (i=0;i 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 local_max) local_max = fabs(e1[i]); } else { jj = 0; local_max = 0.0; for(i=0;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 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 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 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);*/ *CF_marker_ptr = CF_marker; *coarse_size_ptr = coarse_size; hypre_TFree(sum, HYPRE_MEMORY_HOST); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_csr_block_matrix.h000066400000000000000000000345621355566575400221110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* array of length num_procs+1, row_starts[i] contains the global number of the first row on proc i, first_row_index = row_starts[my_id], row_starts[num_procs] = global_num_rows */ HYPRE_BigInt *col_starts; /* array of length num_procs+1, col_starts[i] contains the global number of the first column of diag on proc i, first_col_diag = col_starts[my_id], col_starts[num_procs] = global_num_cols */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRBlockMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Does the ParCSRBlockMatrix create/destroy `row_starts', `col_starts'? */ HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; 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_ParCSRBlockMatrixOwnsRowStarts(matrix) ((matrix) -> owns_row_starts) #define hypre_ParCSRBlockMatrixOwnsColStarts(matrix) ((matrix) -> owns_col_starts) #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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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_Int *col_offd_S_to_A, 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.18.2/src/parcsr_ls/par_cycle.c000066400000000000000000000713301355566575400176500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #ifdef HYPRE_USING_CALIPER #include #endif /*-------------------------------------------------------------------------- * 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; 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; HYPRE_Real *Ptemp_data; HYPRE_Int **CF_marker_array; /* 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; 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; /* 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_Real **l1_norms = NULL; HYPRE_Real *l1_norms_level; HYPRE_Real **ds = hypre_ParAMGDataChebyDS(amg_data); HYPRE_Real **coefs = hypre_ParAMGDataChebyCoefs(amg_data); HYPRE_Int seq_cg = 0; MPI_Comm comm; #if 0 HYPRE_Real *D_mat; HYPRE_Real *S_vec; #endif #ifdef HYPRE_USING_CALIPER cali_id_t iter_attr = cali_create_attribute("hypre.par_cycle.level", CALI_TYPE_INT, CALI_ATTR_DEFAULT); #endif /* 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); /*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 == 17 || smooth_type == 18 || smooth_type == 9 || smooth_type == 19) { HYPRE_Int actual_local_size = hypre_ParVectorActualLocalSize(Vtemp); Utemp = hypre_ParVectorCreate(comm,hypre_ParVectorGlobalSize(Vtemp), hypre_ParVectorPartitioning(Vtemp)); hypre_ParVectorOwnsPartitioning(Utemp) = 0; 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); } } } /*--------------------------------------------------------------------- * Main loop of cycling *--------------------------------------------------------------------*/ #ifdef HYPRE_USING_CALIPER cali_set_int(iter_attr, level); #endif while (Not_Finished) { if (num_levels > 1) { local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_VectorSize(hypre_ParVectorLocalVector(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_VectorSize(hypre_ParVectorLocalVector(Ztemp)) = local_size; hypre_VectorSize(hypre_ParVectorLocalVector(Rtemp)) = local_size; hypre_VectorSize(hypre_ParVectorLocalVector(Ptemp)) = local_size; Ztemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ztemp)); Ptemp_data = hypre_VectorData(hypre_ParVectorLocalVector(Ptemp)); hypre_ParVectorSetConstantValues(Ztemp,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 = 1; /* 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 (l1_norms != NULL) { l1_norms_level = l1_norms[level]; } else { l1_norms_level = NULL; } if (cycle_param == 3 && seq_cg) { hypre_seqAMGCycle(amg_data, level, F_array, U_array); } #ifdef HYPRE_USING_DSUPERLU else if (cycle_param == 3 && hypre_ParAMGDataDSLUSolver(amg_data) != NULL) { hypre_SLUDistSolve(hypre_ParAMGDataDSLUSolver(amg_data), Aux_F, Aux_U); } #endif else { /*------------------------------------------------------------------ * Do the relaxation num_sweep times *-----------------------------------------------------------------*/ for (jj = 0; jj < cg_num_sweep; jj++) { if (smooth_num_levels > level && smooth_type > 9) { hypre_ParVectorSetConstantValues(Aux_U, 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 == 19 || smooth_type == 17 || smooth_type == 18)) { hypre_VectorSize(hypre_ParVectorLocalVector(Utemp)) = local_size; alpha = -1.0; beta = 1.0; //printf("par_cycle.c 2 %d\n",level); hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[level], U_array[level], beta, Aux_F, Vtemp); 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 == 7 || smooth_type == 17) { HYPRE_ParCSRPilutSolve(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 == 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 == 99 || relax_type == 199) { /* Gaussian elimination */ hypre_GaussElimSolve(amg_data, level, relax_type); } else if (relax_type == 18) { /* L1 - Jacobi*/ if (relax_order == 1 && cycle_param < 3) { /* need to do CF - so can't use the AMS one */ HYPRE_Int i; HYPRE_Int loc_relax_points[2]; if (cycle_type < 2) { loc_relax_points[0] = 1; loc_relax_points[1] = -1; } else { loc_relax_points[0] = -1; loc_relax_points[1] = 1; } for (i=0; i < 2; i++) { hypre_ParCSRRelax_L1_Jacobi(A_array[level], Aux_F, CF_marker_array[level], loc_relax_points[i], relax_weight[level], l1_norms[level], Aux_U, Vtemp); } } else /* not CF - so use through AMS */ { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_ParCSRRelax(A_array[level], Aux_F, 1, 1, l1_norms_level, relax_weight[level], omega[level],0,0,0,0, Aux_U, Vtemp, Ztemp); #else if ( hypre_NumThreads() == 1 ) { hypre_ParCSRRelax(A_array[level], Aux_F, 1, 1, l1_norms_level, relax_weight[level], omega[level],0,0,0,0, Aux_U, Vtemp, Ztemp); } else { hypre_ParCSRRelaxThreads(A_array[level], Aux_F, 1, 1, l1_norms_level, relax_weight[level], omega[level], Aux_U, Vtemp, Ztemp); } #endif } } 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, ds[level], coefs[level], cheby_order, scale, variant, Aux_U, Vtemp, Ztemp ); } else if (relax_type == 17) { //printf("Proc %d: level %d, n %d, CF %p\n", my_id, level, local_size, CF_marker_array[level]); 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_array[level], 0, 0, relax_weight[level], 0.0, NULL, Aux_U, Vtemp, NULL); } else { hypre_BoomerAMGRelax_FCFJacobi(A_array[level], Aux_F, CF_marker_array[level], relax_weight[level], Aux_U, Vtemp); } } else if (old_version) { /* printf("cycle %d: relax_type %d, relax_points %d\n", cycle_param, relax_type, relax_points); */ Solve_err_flag = hypre_BoomerAMGRelax(A_array[level], Aux_F, CF_marker_array[level], relax_type, relax_points, relax_weight[level], omega[level], l1_norms_level, 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_array[level], 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_array[level], relax_type, relax_local, cycle_param, relax_weight[level], omega[level], l1_norms_level, Aux_U, Vtemp, Ztemp); } } if (Solve_err_flag != 0) { return(Solve_err_flag); } } 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; 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); } } } /*------------------------------------------------------------------ * 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_ParVectorSetConstantValues(U_array[coarse_grid], 0.0); alpha = -1.0; beta = 1.0; 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); } alpha = 1.0; beta = 0.0; 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]); } } ++level; lev_counter[level] = hypre_max(lev_counter[level], cycle_type); cycle_param = 1; if (level == num_levels-1) { cycle_param = 3; } #ifdef HYPRE_USING_CALIPER cali_set_int(iter_attr, level); /* set the level for caliper here */ #endif } 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; 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); */ } --level; if (fcycle && fcycle_lev == level) { lev_counter[level] = hypre_max(lev_counter[level], 1); fcycle_lev --; } cycle_param = 2; #ifdef HYPRE_USING_CALIPER cali_set_int(iter_attr, level); /* set the level for caliper here */ #endif } else { Not_Finished = 0; } } /* main loop: while (Not_Finished) */ #ifdef HYPRE_USING_CALIPER cali_end(iter_attr); /* unset "iter" */ #endif 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); } } return(Solve_err_flag); } hypre-2.18.2/src/parcsr_ls/par_difconv.c000066400000000000000000000241611355566575400202010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt,2,HYPRE_MEMORY_HOST); 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; #else HYPRE_Int nx_size, ny_size, nz_size; HYPRE_Int jx, jy, jz; global_part = hypre_CTAlloc(HYPRE_BigInt, P*Q*R+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jz = 0; jz < R; jz++) { nz_size = (HYPRE_Int)(nz_part[jz+1]-nz_part[jz]); for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size*nz_size); } } } #endif diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); if (offd_i[local_num_rows]) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); } 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_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.18.2/src/parcsr_ls/par_gauss_elim.c000066400000000000000000000307471355566575400207100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #include "../sstruct_ls/gselim.h" /*------------------------------------------------------------------------- * * Gaussian Elimination * *------------------------------------------------------------------------ */ HYPRE_Int hypre_GaussElimSetup (hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int relax_type) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SETUP] -= hypre_MPI_Wtime(); #endif /* Par Data Structure variables */ hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A); HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int global_num_rows = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A); MPI_Comm comm = hypre_ParCSRMatrixComm(A); MPI_Comm new_comm; HYPRE_Int memory_location = hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A_diag)); hypre_CSRMatrix *A_diag_host, *A_offd_host; if (memory_location != HYPRE_MEMORY_HOST) { A_diag_host = hypre_CSRMatrixClone_v2(A_diag, 1, HYPRE_MEMORY_HOST); A_offd_host = hypre_CSRMatrixClone_v2(A_offd, 1, HYPRE_MEMORY_HOST); } else { A_diag_host = A_diag; A_offd_host = A_offd; } /* Generate sub communicator: processes that have nonzero num_rows */ hypre_GenerateSubComm(comm, num_rows, &new_comm); if (num_rows) { HYPRE_BigInt *col_map_offd = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int *A_diag_i = hypre_CSRMatrixI(A_diag_host); HYPRE_Int *A_offd_i = hypre_CSRMatrixI(A_offd_host); HYPRE_Int *A_diag_j = hypre_CSRMatrixJ(A_diag_host); HYPRE_Int *A_offd_j = hypre_CSRMatrixJ(A_offd_host); HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag_host); HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd_host); HYPRE_Real *A_mat, *A_mat_local; HYPRE_Int *comm_info, *info, *displs; HYPRE_Int *mat_info, *mat_displs; HYPRE_Int new_num_procs, A_mat_local_size, i, jj, column; HYPRE_BigInt first_row_index = hypre_ParCSRMatrixFirstRowIndex(A); hypre_MPI_Comm_size(new_comm, &new_num_procs); 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_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]; } hypre_ParAMGDataBVec(amg_data) = hypre_CTAlloc(HYPRE_Real, global_num_rows, HYPRE_MEMORY_HOST); 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_CTAlloc(HYPRE_Real, global_num_rows*global_num_rows, HYPRE_MEMORY_HOST); /* 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++) { /* need col major */ column = A_diag_j[jj]+first_row_index; A_mat_local[i*global_num_rows + column] = A_diag_data[jj]; } for (jj = A_offd_i[i]; jj < A_offd_i[i+1]; jj++) { /* need col major */ column = col_map_offd[A_offd_j[jj]]; A_mat_local[i*global_num_rows + column] = 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); if (relax_type == 99) { HYPRE_Real *AT_mat = hypre_CTAlloc(HYPRE_Real, global_num_rows*global_num_rows, HYPRE_MEMORY_HOST); 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]; } } hypre_ParAMGDataAMat(amg_data) = AT_mat; hypre_TFree(A_mat, HYPRE_MEMORY_HOST); } else if (relax_type == 9) { hypre_ParAMGDataAMat(amg_data) = A_mat; } else if (relax_type == 199) { HYPRE_Real *AT_mat = hypre_TAlloc(HYPRE_Real, global_num_rows*global_num_rows, HYPRE_MEMORY_HOST); HYPRE_Real *Ainv = hypre_TAlloc(HYPRE_Real, num_rows*global_num_rows, HYPRE_MEMORY_HOST); 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]; } } HYPRE_Int *ipiv, info, query = -1, lwork; HYPRE_Real lwork_opt, *work; ipiv = hypre_TAlloc(HYPRE_Int, global_num_rows, HYPRE_MEMORY_HOST); hypre_dgetrf(&global_num_rows, &global_num_rows, AT_mat, &global_num_rows, ipiv, &info); hypre_assert(info == 0); hypre_dgetri(&global_num_rows, AT_mat, &global_num_rows, ipiv, &lwork_opt, &query, &info); hypre_assert(info == 0); lwork = lwork_opt; work = hypre_TAlloc(HYPRE_Real, lwork, HYPRE_MEMORY_HOST); hypre_dgetri(&global_num_rows, AT_mat, &global_num_rows, ipiv, work, &lwork, &info); hypre_assert(info == 0); for (i = 0; i < global_num_rows; i++) { for (jj = 0; jj < num_rows; jj++) { Ainv[i*num_rows+jj] = AT_mat[i*global_num_rows+jj+first_row_index]; } } hypre_TFree(ipiv, HYPRE_MEMORY_HOST); hypre_TFree(A_mat, HYPRE_MEMORY_HOST); hypre_TFree(AT_mat, HYPRE_MEMORY_HOST); hypre_TFree(work, HYPRE_MEMORY_HOST); hypre_ParAMGDataAInv(amg_data) = Ainv; } hypre_ParAMGDataCommInfo(amg_data) = comm_info; hypre_ParAMGDataNewComm(amg_data) = new_comm; hypre_TFree(mat_info, HYPRE_MEMORY_HOST); hypre_TFree(mat_displs, HYPRE_MEMORY_HOST); hypre_TFree(A_mat_local, 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); } } hypre_ParAMGDataGSSetup(amg_data) = 1; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SETUP] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } HYPRE_Int hypre_GaussElimSolve (hypre_ParAMGData *amg_data, HYPRE_Int level, HYPRE_Int relax_type) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SOLVE] -= hypre_MPI_Wtime(); #endif hypre_ParCSRMatrix *A = hypre_ParAMGDataAArray(amg_data)[level]; hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int error_flag = 0; if (hypre_ParAMGDataGSSetup(amg_data) == 0) { hypre_GaussElimSetup(amg_data, level, relax_type); } if (n) { MPI_Comm new_comm = hypre_ParAMGDataNewComm(amg_data); hypre_ParVector *f = hypre_ParAMGDataFArray(amg_data)[level]; hypre_ParVector *u = hypre_ParAMGDataUArray(amg_data)[level]; HYPRE_Real *b_vec = hypre_ParAMGDataBVec(amg_data); HYPRE_Real *f_data = hypre_VectorData(hypre_ParVectorLocalVector(f)); HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(u)); HYPRE_Int *comm_info = hypre_ParAMGDataCommInfo(amg_data); HYPRE_Int *displs, *info; HYPRE_Int n_global = (HYPRE_Int) hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int new_num_procs; HYPRE_Int first_row_index = (HYPRE_Int) hypre_ParCSRMatrixFirstRowIndex(A); HYPRE_Int one_i = 1; hypre_MPI_Comm_size(new_comm, &new_num_procs); info = &comm_info[0]; displs = &comm_info[new_num_procs]; HYPRE_Int memory_location = hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A_diag)); HYPRE_Real *f_data_host, *u_data_host; if (memory_location != HYPRE_MEMORY_HOST) { f_data_host = hypre_TAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); u_data_host = hypre_TAlloc(HYPRE_Real, n, HYPRE_MEMORY_HOST); hypre_TMemcpy(f_data_host, f_data, HYPRE_Real, n, HYPRE_MEMORY_HOST, memory_location); } else { f_data_host = f_data; u_data_host = u_data; } hypre_MPI_Allgatherv (f_data_host, n, HYPRE_MPI_REAL, b_vec, info, displs, HYPRE_MPI_REAL, new_comm); if (f_data_host != f_data) { hypre_TFree(f_data_host, HYPRE_MEMORY_HOST); } if (relax_type == 9 || relax_type == 19) { HYPRE_Real *A_mat = hypre_ParAMGDataAMat(amg_data); HYPRE_Real *A_tmp; HYPRE_Int i, my_info; A_tmp = hypre_CTAlloc(HYPRE_Real, n_global*n_global, HYPRE_MEMORY_HOST); for (i = 0; i < n_global*n_global; i++) { A_tmp[i] = A_mat[i]; } if (relax_type == 9) { hypre_gselim(A_tmp, b_vec, n_global, error_flag); } else if (relax_type == 99) /* use pivoting */ { HYPRE_Int *piv = hypre_CTAlloc(HYPRE_Int, n_global, HYPRE_MEMORY_HOST); /* write over A with LU */ hypre_dgetrf(&n_global, &n_global, A_tmp, &n_global, piv, &my_info); /* now b_vec = inv(A)*b_vec */ hypre_dgetrs("N", &n_global, &one_i, A_tmp, &n_global, piv, b_vec, &n_global, &my_info); hypre_TFree(piv, HYPRE_MEMORY_HOST); } for (i = 0; i < n; i++) { u_data_host[i] = b_vec[first_row_index+i]; } hypre_TFree(A_tmp, HYPRE_MEMORY_HOST); } else if (relax_type == 199) { HYPRE_Real *Ainv = hypre_ParAMGDataAInv(amg_data); char cN = 'N'; HYPRE_Real one = 1.0, zero = 0.0; hypre_dgemv(&cN, &n, &n_global, &one, Ainv, &n, b_vec, &one_i, &zero, u_data_host, &one_i); } if (u_data_host != u_data) { hypre_TMemcpy(u_data, u_data_host, HYPRE_Real, n, memory_location, HYPRE_MEMORY_HOST); hypre_TFree(u_data_host, HYPRE_MEMORY_HOST); } } if (error_flag) { hypre_error(HYPRE_ERROR_GENERIC); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_GS_ELIM_SOLVE] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #if 0 #include "HYPRE_config.h" #ifndef HYPRE_SEQUENTIAL #define HYPRE_SEQUENTIAL #endif #include "_hypre_utilities.h" #include "_hypre_blas.h" #if defined(HYPRE_USING_CUDA) #define BLOCK_SIZE 512 __global__ void hypreCUDAKernel_dgemv(HYPRE_Int m, HYPRE_Int n, HYPRE_Int lda, HYPRE_Real *a, HYPRE_Real *x, HYPRE_Real *y) { __shared__ HYPRE_Real sh_x[BLOCK_SIZE]; HYPRE_Int row = hypre_cuda_get_grid_thread_id<1,1>(); HYPRE_Int tid = hypre_cuda_get_thread_id<1>(); HYPRE_Real y_row = 0.0; for (HYPRE_Int k = 0; k < n; k += BLOCK_SIZE) { if (k + tid < n) { sh_x[tid] = read_only_load(&x[k+tid]); } __syncthreads(); if (row < m) { #pragma unroll for (HYPRE_Int j = 0; j < BLOCK_SIZE; j++) { const HYPRE_Int col = k + j; if (col < n) { y_row += a[row + col*lda] * sh_x[j]; } } } __syncthreads(); } if (row < m) { y[row] = y_row; } } HYPRE_Int hypre_dgemv_device(HYPRE_Int m, HYPRE_Int n, HYPRE_Int lda, HYPRE_Real *a, HYPRE_Real *x, HYPRE_Real *y) { dim3 bDim(BLOCK_SIZE, 1, 1); dim3 gDim = hypre_GetDefaultCUDAGridDimension(m, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_dgemv, gDim, bDim, m, n, lda, a, x, y ); return hypre_error_flag; } #endif #endif hypre-2.18.2/src/parcsr_ls/par_gsmg.c000066400000000000000000002043701355566575400175100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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 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 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 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= 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= 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; 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_ParVectorSetPartitioningOwner(Zero,0); hypre_ParVectorInitialize(Zero); datax = hypre_VectorData(hypre_ParVectorLocalVector(Zero)); for (i=0; i 1) { Qtemp = hypre_ParVectorCreate(comm, n, starts); hypre_ParVectorInitialize(Qtemp); hypre_ParVectorSetPartitioningOwner(Qtemp,0); } /* 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 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 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); if (num_procs > 1) hypre_CSRMatrixDestroy(S_ext); return(0); } /*--------------------------------------------------------------------------- * 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) { 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; HYPRE_Real *S_ext_data; HYPRE_Int *S_ext_i; HYPRE_BigInt *S_ext_j; 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(); #ifdef HYPRE_NO_GLOBAL_PARTITION //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);*/ #else //my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); if (num_procs > 1) hypre_CSRMatrixDestroy(S_ext); return(0); } hypre-2.18.2/src/parcsr_ls/par_indepset.c000066400000000000000000000150251355566575400203630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/parcsr_ls/par_indepset_device.c000066400000000000000000000212361355566575400217030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #if defined(HYPRE_USING_CUDA) __global__ void hypreCUDAKernel_IndepSetMain(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_cuda_get_grid_warp_id<1,1>(); if (warp_id >= graph_diag_size) { return; } HYPRE_Int lane = hypre_cuda_get_lane_id<1>(); HYPRE_Int row, row_start, row_end; HYPRE_Int i, j; HYPRE_Real t, 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 = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 0); row_end = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 1); if (lane == 0) { t = read_only_load(measure_diag + row); } measure_row = __shfl_sync(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 = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 0); row_end = __shfl_sync(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(marker_row); if (lane == 0 && marker_row == 0) { IS_marker_diag[row] = 0; } } __global__ void hypreCUDAKernel_IndepSetFixMarker(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_cuda_get_grid_thread_id<1,1>(); 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); dim3 bDim, gDim; 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, 1); /*------------------------------------------------------- * Remove nodes from the initial independent set *-------------------------------------------------------*/ bDim = hypre_GetDefaultCUDABlockDimension(); gDim = hypre_GetDefaultCUDAGridDimension(graph_diag_size, "warp", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_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 *-------------------------------------------------------------------*/ 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_GetDefaultCUDAGridDimension(num_elmts_send, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_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: CURAND; 11: SEQ CURAND (TODO) * 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 { curandGenerator_t gen = hypre_HandleCurandGenerator(hypre_handle); HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, 2747 + my_id) ); if (sizeof(HYPRE_Real) == sizeof(hypre_double)) { HYPRE_CURAND_CALL( curandGenerateUniformDouble(gen, (hypre_double *) urand, num_rows_diag) ); } else if (sizeof(HYPRE_Real) == sizeof(float)) { HYPRE_CURAND_CALL( curandGenerateUniform(gen, (float *) urand, num_rows_diag) ); } } thrust::plus op; HYPRE_THRUST_CALL(transform, measure_array, measure_array + num_rows_diag, urand, measure_array, op); hypre_TFree(urand, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif // #if defined(HYPRE_USING_CUDA) hypre-2.18.2/src/parcsr_ls/par_interp.c000066400000000000000000005240721355566575400200600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, 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; 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; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION //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); #else //my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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_SHARED); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); 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_SHARED); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); /*----------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); if (num_procs > 1) 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_Int *col_offd_S_to_A, 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; 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; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); num_threads = hypre_NumThreads(); #ifdef HYPRE_NO_GLOBAL_PARTITION //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); #else //my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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++; } } } else { 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); if (num_procs > 1) { 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_Int *col_offd_S_to_A, 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_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(); #ifdef HYPRE_NO_GLOBAL_PARTITION //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); #else //my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] > 0) { jj_count_offd[j]++; } } } else { 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_SHARED); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); 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_SHARED); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); /*----------------------------------------------------------------------- * 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; 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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++; } } } else { 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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 *col_offd_S_to_A, hypre_ParCSRMatrix **P_ptr) { #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); #endif HYPRE_Int exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(A)) ); hypre_assert(exec != HYPRE_EXEC_UNSET); HYPRE_Int ierr = 0; if (exec == HYPRE_EXEC_HOST) { /* printf(" dir interp Host\n"); */ ierr = hypre_BoomerAMGBuildDirInterpHost(A,CF_marker,S,num_cpts_global,num_functions,dof_func, debug_flag,trunc_factor,max_elmts,col_offd_S_to_A, P_ptr); /* printf(" done dir interp Host\n");*/ } #if defined(HYPRE_USING_CUDA) else { /* printf(" dir interp Device\n");*/ ierr = hypre_BoomerAMGBuildDirInterpDevice(A,CF_marker,S,num_cpts_global,num_functions,dof_func, debug_flag,trunc_factor,max_elmts,col_offd_S_to_A, P_ptr); /* printf(" done dir interp Device\n");*/ } #endif #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif return ierr; } HYPRE_Int hypre_BoomerAMGInterpTruncation( 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_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_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_j_new; HYPRE_Real *P_diag_data_new; 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_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_j_new; HYPRE_Real *P_offd_data_new; HYPRE_Int n_fine = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int num_cols = hypre_CSRMatrixNumCols(P_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 P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int num_elmts; HYPRE_Int cnt, cnt_diag, cnt_offd; HYPRE_Real max_coef; HYPRE_Real row_sum; HYPRE_Real scale; HYPRE_Int mem_loc_diag = hypre_CSRMatrixMemoryLocation(P_diag); HYPRE_Int mem_loc_offd = hypre_CSRMatrixMemoryLocation(P_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,max_coef,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. P_diag_i is only made globally consistent at the end of this * routine. During the dropping phases, P_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 (trunc_factor > 0) { num_lost = 0; num_lost_offd = 0; next_open = P_diag_i[start]; now_checking = P_diag_i[start]; next_open_offd = P_offd_i[start];; now_checking_offd = P_offd_i[start];; for (i = start; i < stop; i++) { max_coef = 0; for (j = P_diag_i[i]; j < P_diag_i[i+1]; j++) { max_coef = (max_coef < fabs(P_diag_data[j])) ? fabs(P_diag_data[j]) : max_coef; } for (j = P_offd_i[i]; j < P_offd_i[i+1]; j++) { max_coef = (max_coef < fabs(P_offd_data[j])) ? fabs(P_offd_data[j]) : max_coef; } max_coef *= trunc_factor; start_j = P_diag_i[i]; if (num_lost) P_diag_i[i] -= num_lost; row_sum = 0; scale = 0; for (j = start_j; j < P_diag_i[i+1]; j++) { row_sum += P_diag_data[now_checking]; if (fabs(P_diag_data[now_checking]) < max_coef) { num_lost++; now_checking++; } else { scale += P_diag_data[now_checking]; P_diag_data[next_open] = P_diag_data[now_checking]; P_diag_j[next_open] = P_diag_j[now_checking]; now_checking++; next_open++; } } start_j = P_offd_i[i]; if (num_lost_offd) 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]; if (fabs(P_offd_data[now_checking_offd]) < max_coef) { num_lost_offd++; now_checking_offd++; } else { scale += P_offd_data[now_checking_offd]; P_offd_data[next_open_offd] = P_offd_data[now_checking_offd]; P_offd_j[next_open_offd] = P_offd_j[now_checking_offd]; now_checking_offd++; next_open_offd++; } } /* normalize row of P */ if (scale != 0.) { if (scale != row_sum) { scale = row_sum/scale; for (j = P_diag_i[i]; j < (P_diag_i[i+1]-num_lost); j++) { P_diag_data[j] *= scale; } for (j = P_offd_i[i]; j < (P_offd_i[i+1]-num_lost_offd); j++) { P_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_elmts > 0) { HYPRE_Int P_mxnum, cnt1, last_index, last_index_offd; HYPRE_Int *P_aux_j; HYPRE_Real *P_aux_data; /* find maximum row length locally over this row range */ P_mxnum = 0; for (i=start; i P_mxnum) { P_mxnum = cnt1; } } /* Some rows exceed max_elmts, and require truncation. Essentially, * each thread truncates and compresses its range of rows locally. */ if (P_mxnum > max_elmts) { num_lost = 0; num_lost_offd = 0; /* two temporary arrays to hold row i for temporary operations */ P_aux_j = hypre_CTAlloc(HYPRE_Int, P_mxnum, HYPRE_MEMORY_HOST); P_aux_data = hypre_CTAlloc(HYPRE_Real, P_mxnum, HYPRE_MEMORY_HOST); cnt_diag = P_diag_i[start]; cnt_offd = P_offd_i[start]; for (i = start; i < stop; i++) { /* Note P_diag_i[stop] is the starting point for the next thread * in j and data, not the stop point for this thread */ last_index = P_diag_i[i+1]; last_index_offd = P_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-P_diag_i[i] + last_index_offd-P_offd_i[i]; if (max_elmts < num_elmts) { /* copy both diagonal and off-diag parts of row i to _aux_ arrays */ cnt = 0; for (j = P_diag_i[i]; j < last_index; j++) { P_aux_j[cnt] = P_diag_j[j]; P_aux_data[cnt++] = P_diag_data[j]; row_sum += P_diag_data[j]; } num_lost += cnt; cnt1 = cnt; for (j = P_offd_i[i]; j < last_index_offd; j++) { P_aux_j[cnt] = P_offd_j[j]+num_cols; P_aux_data[cnt++] = P_offd_data[j]; row_sum += P_offd_data[j]; } num_lost_offd += cnt-cnt1; /* sort data */ hypre_qsort2abs(P_aux_j,P_aux_data,0,cnt-1); scale = 0; if (i > start) { P_diag_i[i] = cnt_diag; P_offd_i[i] = cnt_offd; } for (j = 0; j < max_elmts; j++) { scale += P_aux_data[j]; 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]; } else { P_offd_j[cnt_offd] = P_aux_j[j]-num_cols; P_offd_data[cnt_offd++] = P_aux_data[j]; } } num_lost -= cnt_diag-P_diag_i[i]; num_lost_offd -= cnt_offd-P_offd_i[i]; /* normalize row of P */ if (scale != 0.) { if (scale != row_sum) { scale = row_sum/scale; for (j = P_diag_i[i]; j < cnt_diag; j++) { P_diag_data[j] *= scale; } for (j = P_offd_i[i]; j < cnt_offd; j++) { P_offd_data[j] *= scale; } } } } /* end if (max_elmts < num_elmts) */ else { /* nothing dropped from this row, but still have to shift entries back * by the number dropped so far */ if (P_diag_i[i] != cnt_diag) { start_j = P_diag_i[i]; P_diag_i[i] = cnt_diag; for (j = start_j; j < last_index; j++) { P_diag_j[cnt_diag] = P_diag_j[j]; P_diag_data[cnt_diag++] = P_diag_data[j]; } } else { cnt_diag += last_index-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 < last_index_offd; j++) { P_offd_j[cnt_offd] = P_offd_j[j]; P_offd_data[cnt_offd++] = P_offd_data[j]; } } else { cnt_offd += last_index_offd-P_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(P_aux_j, HYPRE_MEMORY_HOST); hypre_TFree(P_aux_data, HYPRE_MEMORY_HOST); } /* end if (P_mxnum > max_elmts) */ } /* end if (max_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., * P_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) { P_diag_size = P_diag_i[n_fine]; for (i = 0; i < max_num_threads[0]; i++) { P_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]; } } P_diag_j_new = hypre_CTAlloc(HYPRE_Int, P_diag_size, mem_loc_diag); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, P_diag_size, mem_loc_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 = P_diag_i[start] - cum_lost_per_thread[my_thread_num-1]; } /* copy the j and data arrays over */ for (i = P_diag_i[start]; i < P_diag_i[stop] - num_lost_per_thread[my_thread_num]; i++) { P_diag_j_new[next_open] = P_diag_j[i]; P_diag_data_new[next_open] = P_diag_data[i]; next_open += 1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* update P_diag_i with number of dropped entries by all lower ranked * threads */ if (my_thread_num > 0) { for (i=start; 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]; } } P_offd_j_new = hypre_CTAlloc(HYPRE_Int, P_offd_size, mem_loc_offd); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, P_offd_size, mem_loc_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 = P_offd_i[start] - cum_lost_per_thread[my_thread_num-1]; } /* copy the j and data arrays over */ for (i = P_offd_i[start]; i < P_offd_i[stop] - num_lost_offd_per_thread[my_thread_num]; i++) { P_offd_j_new[next_open] = P_offd_j[i]; P_offd_data_new[next_open] = P_offd_data[i]; next_open += 1; } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /* update P_offd_i with number of dropped entries by all lower ranked * threads */ if (my_thread_num > 0) { for (i=start; i 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] >= 0) { jj_count_offd[j]++; } } } else { 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) { if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[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; } } } else { 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); if (num_procs > 1) 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); hypre_ParCSRMatrixOwnsRowStarts(C) = 0; hypre_ParCSRMatrixOwnsColStarts(C) = 0; 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 = fabs(A_diag_data[index]); for (j = index+1; j < A_diag_i[i+1]; j++) w_local += fabs(A_diag_data[j]); for (j = A_offd_i[i]; j < A_offd_i[i+1]; j++) w_local += fabs(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_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_Int *col_offd_S_to_A, 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 *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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = fabs(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 = fabs(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,HYPRE_MEMORY_HOST); P_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag,HYPRE_MEMORY_HOST); P_diag_data = hypre_CTAlloc(HYPRE_Real, nnz_diag,HYPRE_MEMORY_HOST); /* not in ``if num_procs > 1'', * allocation needed even for empty CSR */ P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1,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); /* 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; /* P does not own ColStarts, since A does */ hypre_ParCSRMatrixOwnsRowStarts(P) = 0; 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-2.18.2/src/parcsr_ls/par_interp_device.c000066400000000000000000000671571355566575400214050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #if defined(HYPRE_USING_CUDA) __global__ void hypre_BoomerAMGBuildDirInterp_dev1( 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* A_offd_i, HYPRE_Int* A_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, HYPRE_Int* col_offd_S_to_A, HYPRE_Int* fine_to_coarse ); __global__ void hypre_BoomerAMGBuildDirInterp_dev2( 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* 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_diag_j, HYPRE_Real* P_diag_data, HYPRE_Int* P_offd_i, HYPRE_Int* P_offd_j, HYPRE_Real* P_offd_data, HYPRE_Int* col_offd_S_to_A, HYPRE_Int* fine_to_coarse ); __global__ void hypre_BoomerAMGBuildDirInterp_dev3( HYPRE_Int P_offd_size, HYPRE_Int* P_offd_j, HYPRE_Int* P_marker ); __global__ void hypre_BoomerAMGBuildDirInterp_dev4( HYPRE_Int num_cols_A_offd, HYPRE_Int* P_marker, HYPRE_Int* tmp_map_offd ); __global__ void hypre_BoomerAMGBuildDirInterp_dev5( HYPRE_Int P_offd_size, HYPRE_Int* P_offd_j, HYPRE_Int* P_marker ); /*--------------------------------------------------------------------------- * 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 *col_offd_S_to_A, 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_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); hypre_ParCSRMatrix *P; HYPRE_BigInt *col_map_offd_P; HYPRE_Int *tmp_map_offd = NULL; HYPRE_Int *CF_marker_dev = NULL; /* HYPRE_Int *CF_marker_host = 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 n_fine = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int *fine_to_coarse; HYPRE_BigInt total_global_cpts; HYPRE_Int num_cols_P_offd; HYPRE_Int i; HYPRE_Int j; HYPRE_Int start; // HYPRE_Int prproc=2; HYPRE_Int my_id; HYPRE_Int num_procs; HYPRE_Int num_sends; HYPRE_Int index; HYPRE_Int *int_buf_data; HYPRE_Int limit = 1048576; HYPRE_Real wall_time; /* for debugging instrumentation */ hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION 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[num_procs]; #endif if (!comm_pkg) { hypre_MatvecCommPkgCreate(A); comm_pkg = hypre_ParCSRMatrixCommPkg(A); } if (debug_flag==4) wall_time = time_getWallclockSeconds(); ///* 0. Assume CF_marker has been allocated in device memory */ // CF_marker_host = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_HOST); // hypre_TMemcpy( CF_marker_host, CF_marker, HYPRE_Int, n_fine, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE ); /* 0. Assume CF_marker has been allocated in host memory */ // CF_marker_host = CF_marker; CF_marker_dev = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); hypre_TMemcpy( CF_marker_dev, CF_marker, HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST ); /* 1. Communicate CF_marker to/from other processors */ if (num_cols_A_offd) CF_marker_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_SHARED); 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_host[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)]; = 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(CF_marker_host, HYPRE_MEMORY_HOST); if (num_functions > 1) { /* 2. Communicate dof_func to/from other processors */ if (num_cols_A_offd > 0) dof_func_offd = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_SHARED); 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); } /* 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_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); fine_to_coarse = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_SHARED); dim3 grid, block(32,1,1); grid.x = n_fine/block.x; if( n_fine % block.x != 0 ) grid.x++; if( grid.x > limit ) grid.x = limit; grid.y = 1; grid.z = 1; HYPRE_CUDA_LAUNCH( hypre_BoomerAMGBuildDirInterp_dev1, grid, block, n_fine, S_diag_i, S_diag_j, S_offd_i, S_offd_j, A_offd_i, A_offd_j, CF_marker_dev, CF_marker_offd, num_functions, dof_func, dof_func_offd, P_diag_i, P_offd_i, col_offd_S_to_A, fine_to_coarse ); /* The scans will transform P_diag_i and P_offd_i to the CSR I-vectors */ HYPRE_THRUST_CALL(exclusive_scan, &P_diag_i[0], &P_diag_i[n_fine+1], &P_diag_i[0] ); HYPRE_THRUST_CALL(exclusive_scan, &P_offd_i[0], &P_offd_i[n_fine+1], &P_offd_i[0] ); /* 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 */ HYPRE_THRUST_CALL(exclusive_scan, &fine_to_coarse[0], &fine_to_coarse[n_fine], &fine_to_coarse[0] ); /* 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 */ P_diag_size = P_diag_i[n_fine]; P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); P_offd_size = P_offd_i[n_fine]; P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); HYPRE_CUDA_LAUNCH( hypre_BoomerAMGBuildDirInterp_dev2, grid, block, n_fine, A_diag_i, A_diag_j, A_diag_data, A_offd_i, A_offd_j, A_offd_data, S_diag_i, S_diag_j, S_offd_i, S_offd_j, CF_marker_dev, 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, col_offd_S_to_A, fine_to_coarse ); cudaDeviceSynchronize(); /* 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, 0, 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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); // 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]; } /* 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 */ /* (P is of size m x c) */ num_cols_P_offd = 0; if (P_offd_size) { /* 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 */ /* Example: if A_offd has 6 columns, locally 0,1,..,5, and points 1 and 4 are coarse points, then P_marker=[0,1,0,0,1,0,0], */ /* First, set P_marker[i] to 1 if A's column i is also present in P, otherwise P_marker[i] is 0 */ HYPRE_Int *P_marker = hypre_CTAlloc(HYPRE_Int, num_cols_A_offd+1, HYPRE_MEMORY_DEVICE); HYPRE_CUDA_LAUNCH( hypre_BoomerAMGBuildDirInterp_dev5, grid, block, P_offd_size, P_offd_j, P_marker ); /* Secondly, the sum over P_marker gives the number of different columns in P's offd part */ num_cols_P_offd = HYPRE_THRUST_CALL(reduce, &P_marker[0], &P_marker[num_cols_A_offd]); /* Because P's columns correspond to P_marker[i]=1 (and =0 otherwise), the scan below will return */ /* an enumeration of P's columns 0,1,... at the corresponding locations in P_marker. */ /* P_marker[num_cols_A_offd] will contain num_cols_P_offd, so sum reduction above could */ /* have been replaced by reading the last element of P_marker. */ HYPRE_THRUST_CALL(exclusive_scan, &P_marker[0], &P_marker[num_cols_A_offd+1], &P_marker[0] ); /* Example: P_marker becomes [0,0,1,1,1,2] so that P_marker[1]=0, P_marker[4]=1 */ /* Do the re-enumeration, P_offd_j are mapped, using P_marker as map */ HYPRE_CUDA_LAUNCH( hypre_BoomerAMGBuildDirInterp_dev3, grid, block, P_offd_size, P_offd_j, P_marker ); /* Create and define array tmp_map_offd. This array is the inverse of the P_marker mapping, */ /* Example: num_cols_P_offd=2, tmp_map_offd[0] = 1, tmp_map_offd[1]=4 */ tmp_map_offd = hypre_CTAlloc(HYPRE_Int, num_cols_P_offd, HYPRE_MEMORY_SHARED); grid.x = num_cols_A_offd/block.x; if( num_cols_A_offd % block.x != 0 ) grid.x++; if( grid.x > limit ) grid.x = limit; HYPRE_CUDA_LAUNCH( hypre_BoomerAMGBuildDirInterp_dev4, grid, block, num_cols_A_offd, P_marker, tmp_map_offd ); if (num_cols_P_offd) { col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_HOST); // col_map_offd_P = hypre_CTAlloc(HYPRE_BigInt, num_cols_P_offd, HYPRE_MEMORY_SHARED); hypre_ParCSRMatrixColMapOffd(P) = col_map_offd_P; hypre_CSRMatrixNumCols(P_offd) = num_cols_P_offd; } cudaDeviceSynchronize(); hypre_TFree(P_marker, HYPRE_MEMORY_DEVICE); } /* Not sure what this is for, moved it to Cuda kernel _dev2 */ /* for (i=0; i < n_fine; i++) if (CF_marker[i] == -3) CF_marker[i] = -1; */ /* 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 ??? */ hypre_GetCommPkgRTFromCommPkgA(P, A, fine_to_coarse, tmp_map_offd); *P_ptr = P; hypre_TFree(CF_marker_dev, HYPRE_MEMORY_DEVICE); hypre_TFree(CF_marker_offd, HYPRE_MEMORY_SHARED); hypre_TFree(dof_func_offd, HYPRE_MEMORY_SHARED); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(fine_to_coarse, HYPRE_MEMORY_SHARED); hypre_TFree(tmp_map_offd, HYPRE_MEMORY_SHARED); return hypre_error_flag; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_dev1( 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* A_offd_i, HYPRE_Int* A_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, HYPRE_Int* col_offd_S_to_A, HYPRE_Int* fine_to_coarse ) { /*-----------------------------------------------------------------------*/ /* 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 nonzero elements 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-1. 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 myid= threadIdx.x + blockIdx.x * blockDim.x, i, jj, i1, jPd, jPo; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < nr_of_rows ; i += nthreads ) { /*-------------------------------------------------------------------- * If i is a C-point, interpolation is the identity. *--------------------------------------------------------------------*/ jPd = jPo = 0; if (CF_marker[i] >= 0) { jPd++; fine_to_coarse[i] = 1; } else { /*-------------------------------------------------------------------- * If i is an F-point, interpolation is from the C-points that * strongly influence i. *--------------------------------------------------------------------*/ for (jj = S_diag_i[i]; jj < S_diag_i[i+1]; jj++) { i1 = S_diag_j[jj]; if (CF_marker[i1] > 0 && (num_functions == 1 || (dof_func[i1]==dof_func[i])) ) jPd++; } if (col_offd_S_to_A) { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = col_offd_S_to_A[S_offd_j[jj]]; if (CF_marker_offd[i1] > 0 && ( num_functions == 1 || (dof_func_offd[i1]==dof_func[i])) ) jPo++; } } else { for (jj = S_offd_i[i]; jj < S_offd_i[i+1]; jj++) { i1 = S_offd_j[jj]; /* CF_marker_offd[i1] requires i1 to be in A's column enumeration */ if (CF_marker_offd[i1] > 0 && ( num_functions ==1 || (dof_func_offd[i1]==dof_func[i] )) ) jPo++; } } } P_diag_i[i] = jPd; P_offd_i[i] = jPo; } } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_dev2( 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* 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_diag_j, HYPRE_Real* P_diag_data, HYPRE_Int* P_offd_i, HYPRE_Int* P_offd_j, HYPRE_Real* P_offd_data, HYPRE_Int* col_offd_S_to_A, 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 myid= threadIdx.x + blockIdx.x * blockDim.x, i, ind, indp, inds, i1; HYPRE_Real diagonal, sum_N_pos, sum_N_neg, sum_P_pos, sum_P_neg, alfa, beta, aval; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < nr_of_rows ; i += nthreads ) { if( CF_marker[i] > 0 ) { /*-------------------------------------------------------------------- * If i is a c-point, interpolation is the identity. *--------------------------------------------------------------------*/ ind = P_diag_i[i]; P_diag_j[ind] = fine_to_coarse[i]; P_diag_data[ind] = 1.0; } else { /*-------------------------------------------------------------------- * Point is f-point, use direct interpolation *--------------------------------------------------------------------*/ sum_N_pos = sum_N_neg = sum_P_pos = sum_P_neg = 0; inds=S_diag_i[i]; indp=P_diag_i[i]; diagonal = A_diag_data[A_diag_i[i]]; /* The loops below assume that the sparsity structure of S was obtained */ /* by removing elements from the sparsity structure of A, but that no */ /* reordering of S (or A) has been done */ for( ind=A_diag_i[i]+1; ind < A_diag_i[i+1] ; ind++ ) { i1 = A_diag_j[ind]; aval = A_diag_data[ind]; if (num_functions == 1 || dof_func[i1] == dof_func[i]) { if( aval > 0 ) sum_N_pos += aval; else sum_N_neg += aval; // if (A_diag_data[ind] > 0) // sum_N_pos += A_diag_data[ind]; // else // sum_N_neg += A_diag_data[ind]; } if( inds < S_diag_i[i+1] && i1==S_diag_j[inds] ) { /* Element is in both A and S */ if (CF_marker[i1] > 0 && ( num_functions==1 || dof_func[i1]==dof_func[i]) ) { // P_diag_data[indp] = A_diag_data[ind]; P_diag_data[indp] = aval; P_diag_j[indp++] = fine_to_coarse[i1]; // if( A_diag_data[ind] > 0 ) // sum_P_pos += A_diag_data[ind]; // else // sum_P_neg += A_diag_data[ind]; if( aval > 0 ) sum_P_pos += aval; else sum_P_neg += aval; } inds++; } } inds=S_offd_i[i]; indp=P_offd_i[i]; for( ind=A_offd_i[i]; ind < A_offd_i[i+1] ; ind++ ) { i1 = A_offd_j[ind]; aval = A_offd_data[ind]; if (num_functions == 1 || dof_func_offd[i1] == dof_func[i]) { if (aval > 0) sum_N_pos += aval; else sum_N_neg += aval; } if( col_offd_S_to_A ) i1 = col_offd_S_to_A[S_offd_j[inds]]; if( inds < S_offd_i[i+1] && i1==S_offd_j[inds] ) { /* Element is in both A and S */ if (CF_marker_offd[i1] > 0 && ( num_functions == 1 || dof_func_offd[i1]==dof_func[i] ) ) { P_offd_data[indp] = aval; P_offd_j[indp++] = i1; if( aval > 0 ) sum_P_pos += aval; else sum_P_neg += aval; } inds++; } } alfa=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( indp=P_diag_i[i]; indp < P_diag_i[i+1] ; indp++ ) { P_diag_data[indp] *= (P_diag_data[indp]>0)*(alfa-beta)-alfa; // if (P_diag_data[indp]> 0) // P_diag_data[indp] *= -beta; // else // P_diag_data[indp] *= -alfa; } for( indp=P_offd_i[i]; indp < P_offd_i[i+1] ; indp++ ) { P_offd_data[indp] *= (P_offd_data[indp]>0)*(alfa-beta)-alfa; // if (P_offd_data[indp]> 0) // P_offd_data[indp] *= -beta; // else // P_offd_data[indp] *= -alfa; } if( CF_marker[i] == -3 ) CF_marker[i] = -1; } } } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_dev3( HYPRE_Int P_offd_size, HYPRE_Int* P_offd_j, HYPRE_Int* P_marker ) /* Re-enumerate the columns of P_offd according to the mapping given in P_marker */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < P_offd_size ; i += nthreads ) P_offd_j[i] = P_marker[P_offd_j[i]]; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_dev4( HYPRE_Int num_cols_A_offd, HYPRE_Int* P_marker, HYPRE_Int* tmp_map_offd ) { /* Construct array tmp_map_offd Note: This is an inefficient kernel, its only purpose is to make it possible to keep the arrays on device */ HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < num_cols_A_offd ; i += nthreads ) { if( P_marker[i] < P_marker[i+1] ) tmp_map_offd[P_marker[i]] = i; } } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGBuildDirInterp_dev5( HYPRE_Int P_offd_size, HYPRE_Int* P_offd_j, HYPRE_Int* P_marker ) /* set P_marker[i] to 1 if A's column i is also present in P, otherwise P_marker[i] is 0 */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < P_offd_size ; i += nthreads ) { atomicOr(&P_marker[P_offd_j[i]],1); } } #endif hypre-2.18.2/src/parcsr_ls/par_interp_trunc_device.c000066400000000000000000000703241355566575400226060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #if defined(HYPRE_USING_CUDA) #if 1 __global__ void hypreCUDAKernel_InterpTruncation( 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_cuda_get_grid_warp_id<1,1>(); if (row >= nrows) { return; } HYPRE_Int lane = hypre_cuda_get_lane_id<1>(), p, q; /* 1. compute row max, rowsum */ if (lane < 2) { p = read_only_load(P_i + row + lane); } q = __shfl_sync(HYPRE_WARP_FULL_MASK, p, 1); p = __shfl_sync(HYPRE_WARP_FULL_MASK, p, 0); for (HYPRE_Int i = p + lane; __any_sync(HYPRE_WARP_FULL_MASK, i < q); i += HYPRE_WARP_SIZE) { if (i < q) { HYPRE_Real v = read_only_load(&P_a[i]); row_max = hypre_max(row_max, fabs(v)); row_sum += v; } } row_max = warp_allreduce_max(row_max) * trunc_factor; row_sum = warp_allreduce_sum(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; __any_sync(HYPRE_WARP_FULL_MASK, i < q); i += HYPRE_WARP_SIZE) { HYPRE_Int cond = 0, cond_prev; cond_prev = i == p + lane || warp_allreduce_min(cond); if (i < q) { HYPRE_Real v; cond = cond_prev && i < p + max_elmts; if (cond) { v = read_only_load(&P_a[i]); } cond = cond && fabs(v) >= row_max; if (cond) { last_pos = i; row_scal += v; } else { P_j[i] = -1; } } } row_scal = row_sum / warp_allreduce_sum(row_scal); /* 3. scale the row */ for (HYPRE_Int i = p + lane; i <= last_pos; i += HYPRE_WARP_SIZE) { P_a[i] *= row_scal; } } /*-----------------------------------------------------------------------*/ 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_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 memory_loc = hypre_CSRMatrixMemoryLocation(P_diag); HYPRE_Int new_nnz_diag = 0, new_nnz_offd = 0; HYPRE_Int ierr = 0; /* HYPRE_Int num_procs, my_id; MPI_Comm comm = hypre_ParCSRMatrixComm(P); hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); */ hypreDevice_CsrRowPtrsToIndices_v2(nrows, P_diag_i, P_i); hypreDevice_CsrRowPtrsToIndices_v2(nrows, 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 */ HYPRE_THRUST_CALL(transform, P_offd_j, P_offd_j + nnz_offd, P_j + nnz_diag, -_1 - 2); 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_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(nrows, "warp", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_InterpTruncation, gDim, bDim, nrows, trunc_factor, max_elmts, P_rowptr, P_j, P_a ); /* build new P_diag and P_offd */ if (nnz_diag) { 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; 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); 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; hypre_assert(new_nnz_offd <= nnz_offd); HYPRE_THRUST_CALL(transform, P_offd_j, P_offd_j + new_nnz_offd, P_offd_j, -_1 - 2); hypreDevice_CsrRowIndicesToPtrs_v2(nrows, new_nnz_offd, tmp_rowid, P_offd_i); } /* printf("nnz_diag %d, new nnz_diag %d\n", nnz_diag, new_nnz_diag); printf("nnz_offd %d, new nnz_offd %d\n", nnz_offd, new_nnz_offd); */ hypre_CSRMatrixJ (P_diag) = hypre_TReAlloc(P_diag_j, HYPRE_Int, new_nnz_diag, memory_loc); hypre_CSRMatrixData(P_diag) = hypre_TReAlloc(P_diag_a, HYPRE_Real, new_nnz_diag, memory_loc); hypre_CSRMatrixJ (P_offd) = hypre_TReAlloc(P_offd_j, HYPRE_Int, new_nnz_offd, memory_loc); hypre_CSRMatrixData(P_offd) = hypre_TReAlloc(P_offd_a, HYPRE_Real, new_nnz_offd, memory_loc); 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); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_INTERP_TRUNC] += hypre_MPI_Wtime(); #endif return ierr; } #else __global__ void hypre_BoomerAMGInterpTruncationDevice_dev1( HYPRE_Int num_rows_P, 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* P_aux_diag_i, HYPRE_Int* P_aux_offd_i, HYPRE_Real trunc_factor ); __global__ void hypre_BoomerAMGInterpTruncationDevice_dev2( HYPRE_Int num_rows_P, HYPRE_Int* P_diag_i, HYPRE_Int* P_offd_i, HYPRE_Int* P_aux_diag_i, HYPRE_Int* P_aux_offd_i ); __global__ void hypre_BoomerAMGInterpTruncationDevice_dev3( HYPRE_Int num_rows_P, 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* P_aux_diag_i, HYPRE_Int* P_aux_offd_i, HYPRE_Int max_elements ); __global__ void hypre_BoomerAMGInterpTruncationDevice_dev4( HYPRE_Int num_rows_P, HYPRE_Int* P_diag_i, HYPRE_Int* P_diag_j, HYPRE_Real* P_diag_data, HYPRE_Int* P_diag_i_new, HYPRE_Int* P_diag_j_new, HYPRE_Real* P_diag_data_new, HYPRE_Int* P_offd_i, HYPRE_Int* P_offd_j, HYPRE_Real* P_offd_data, HYPRE_Int* P_offd_i_new, HYPRE_Int* P_offd_j_new, HYPRE_Real* P_offd_data_new ); __device__ void hypre_qsort2abs_dev( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ); __device__ void hypre_isort2abs_dev( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int n ); /*-----------------------------------------------------------------------*/ /* typedef thrust::zip_iterator::iterator,thrust::device_vector::iterator > > ZIvec2Iterator; struct compare_tuple { template __host__ __device__ bool operator()(Tuple lhs, Tuple rhs) { return thrust::get<0>(lhs)+thrust::get<1>(lhs) < thrust::get<0>(rhs)+thrust::get<1>(rhs); } }; */ /*-----------------------------------------------------------------------*/ 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_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_data = hypre_CSRMatrixData(P_diag); HYPRE_Int *P_diag_j_new; HYPRE_Real *P_diag_data_new; 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_data = hypre_CSRMatrixData(P_offd); HYPRE_Int *P_offd_j_new; HYPRE_Real *P_offd_data_new; HYPRE_Int* P_aux_diag_i=NULL; HYPRE_Int* P_aux_offd_i=NULL; HYPRE_Int* nel_per_row; HYPRE_Int n_fine = hypre_CSRMatrixNumRows(P_diag); HYPRE_Int P_diag_size; HYPRE_Int P_offd_size; HYPRE_Int mx_row; HYPRE_Int limit=1048576;/* arbitrarily choosen limit on CUDA grid size, most devices seem to have 2^31 as grid size limit */ bool truncated = false; dim3 grid, block(32,1,1); grid.x = n_fine/block.x; if( n_fine % block.x != 0 ) grid.x++; if( grid.x > limit ) grid.x = limit; grid.y = 1; grid.z = 1; if( 0.0 < trunc_factor && trunc_factor < 1.0 ) { /* truncate with trunc_factor, return number of remaining elements/row in P_aux_diag_i and P_aux_offd_i */ P_aux_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); P_aux_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); HYPRE_CUDA_LAUNCH( hypre_BoomerAMGInterpTruncationDevice_dev1, grid, block, n_fine, P_diag_i, P_diag_j, P_diag_data, P_offd_i, P_offd_j, P_offd_data, P_aux_diag_i, P_aux_offd_i, trunc_factor ); truncated = true; } if( max_elmts > 0 ) { if( !truncated ) { /* If not previously truncated, set up P_aux_diag_i and P_aux_offd_i with full number of elements/row */ P_aux_diag_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); P_aux_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); HYPRE_CUDA_LAUNCH( hypre_BoomerAMGInterpTruncationDevice_dev2, grid,block, n_fine, P_diag_i, P_offd_i, P_aux_diag_i, P_aux_offd_i ); } nel_per_row = hypre_CTAlloc(HYPRE_Int, n_fine, HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL(transform,&P_aux_diag_i[0],&P_aux_diag_i[n_fine],&P_aux_offd_i[0],&nel_per_row[0],thrust::plus() ); mx_row = HYPRE_THRUST_CALL(reduce,&nel_per_row[0],&nel_per_row[n_fine],0,thrust::maximum()); hypre_TFree(nel_per_row,HYPRE_MEMORY_DEVICE); /* Use zip_iterator to avoid creating help array nel_per_row */ /* ZIvec2Iterator i = thrust::max_element(thrust::device,thrust::make_zip_iterator(&P_aux_diag_i[0],&P_aux_offd_i[0]), thrust::make_zip_iterator(&P_aux_diag_i[n_fine],&P_aux_offd_i[n_fine],compare_tuple() )); mx_row = thrust::get<0>(*i)+thrust::get<1>(*i); */ if( mx_row > max_elmts ) { /* Truncate with respect to maximum number of elements per row */ HYPRE_CUDA_LAUNCH( hypre_BoomerAMGInterpTruncationDevice_dev3, grid, block, n_fine, P_diag_i, P_diag_j, P_diag_data, P_offd_i, P_offd_j, P_offd_data, P_aux_diag_i, P_aux_offd_i, max_elmts ); truncated = true; } } if( truncated ) { cudaDeviceSynchronize(); /* Matrix has been truncated, reshuffle it into shorter arrays */ HYPRE_THRUST_CALL(exclusive_scan, &P_aux_diag_i[0],&P_aux_diag_i[n_fine+1],&P_aux_diag_i[0]); P_diag_size = P_aux_diag_i[n_fine]; HYPRE_THRUST_CALL(exclusive_scan, &P_aux_offd_i[0],&P_aux_offd_i[n_fine+1],&P_aux_offd_i[0]); P_offd_size = P_aux_offd_i[n_fine]; P_diag_j_new = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_SHARED); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); P_offd_j_new = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); HYPRE_CUDA_LAUNCH( hypre_BoomerAMGInterpTruncationDevice_dev4, grid,block, n_fine, P_diag_i, P_diag_j, P_diag_data, P_aux_diag_i, P_diag_j_new, P_diag_data_new, P_offd_i, P_offd_j, P_offd_data, P_aux_offd_i, P_offd_j_new, P_offd_data_new ); cudaDeviceSynchronize(); // P_diag_i[n_fine] = P_diag_size ; hypre_TFree(P_diag_i, HYPRE_MEMORY_SHARED); hypre_TFree(P_diag_j, HYPRE_MEMORY_SHARED); hypre_TFree(P_diag_data, HYPRE_MEMORY_SHARED); hypre_CSRMatrixI(P_diag) = P_aux_diag_i; hypre_CSRMatrixJ(P_diag) = P_diag_j_new; hypre_CSRMatrixData(P_diag) = P_diag_data_new; hypre_CSRMatrixNumNonzeros(P_diag) = P_diag_size; // P_offd_i[n_fine] = P_offd_size ; hypre_TFree(P_offd_i, HYPRE_MEMORY_SHARED); hypre_TFree(P_offd_j, HYPRE_MEMORY_SHARED); hypre_TFree(P_offd_data, HYPRE_MEMORY_SHARED); hypre_CSRMatrixI(P_offd) = P_aux_offd_i; hypre_CSRMatrixJ(P_offd) = P_offd_j_new; hypre_CSRMatrixData(P_offd) = P_offd_data_new; hypre_CSRMatrixNumNonzeros(P_offd) = P_offd_size; } else if( P_aux_diag_i != NULL ) { hypre_TFree(P_aux_diag_i, HYPRE_MEMORY_SHARED); hypre_TFree(P_aux_offd_i, HYPRE_MEMORY_SHARED); } return 0; } /* -----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGInterpTruncationDevice_dev1( HYPRE_Int num_rows_P, 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* P_aux_diag_i, HYPRE_Int* P_aux_offd_i, HYPRE_Real trunc_factor ) /* Perform truncation by eleminating all elements from row i whose absolute value is smaller than trunc_factor*max_k|P_{i,k}|. The matrix is rescaled after truncation to conserve its row sums. Input: num_rows_P - Number of rows of matrix in this MPI-task. P_diag_i, P_diag_j, P_diag_data - CSR representation of block diagonal part of matrix. P_offd_i, P_offd_j, P_offd_data - CSR representation of off-block diagonal part of matrix. trunc_factor - Factor in truncation threshold. Output: P_aux_diag_i - P_aux_diag_i[i] holds the number of non-truncated elements on row i of P_diag. P_aux_offd_i - P_aux_offd_i[i] holds the number of non-truncated elements on row i of P_offd. P_diag_j, P_diag_data, P_offd_j, P_offd_data - For rows where truncation occurs, elements are reordered to have the non-truncated elements first on each row, and the data arrays are rescaled. */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i, ind, indp,nel_diag, nel_offd; HYPRE_Real max_coef, row_sum, row_sum_trunc; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < num_rows_P ; i += nthreads ) { /* 1. Compute maximum absolute value element in row */ max_coef = 0; for (ind = P_diag_i[i]; ind < P_diag_i[i+1]; ind++) max_coef = (max_coef < fabs(P_diag_data[ind])) ? fabs(P_diag_data[ind]) : max_coef; for (ind = P_offd_i[i]; ind < P_offd_i[i+1]; ind++) max_coef = (max_coef < fabs(P_offd_data[ind])) ? fabs(P_offd_data[ind]) : max_coef; max_coef *= trunc_factor; /* 2. Eliminate small elements and compress row */ nel_diag = 0; row_sum = 0; row_sum_trunc = 0; indp = P_diag_i[i]; for (ind = P_diag_i[i]; ind < P_diag_i[i+1]; ind++) { row_sum += P_diag_data[ind]; if( fabs(P_diag_data[ind]) >= max_coef) { row_sum_trunc += P_diag_data[ind]; P_diag_data[indp+nel_diag] = P_diag_data[ind]; P_diag_j[indp+nel_diag++] = P_diag_j[ind]; } } nel_offd = 0; indp=P_offd_i[i]; for (ind = P_offd_i[i]; ind < P_offd_i[i+1]; ind++) { row_sum += P_offd_data[ind]; if( fabs(P_offd_data[ind]) >= max_coef) { row_sum_trunc += P_offd_data[ind]; P_offd_data[indp+nel_offd] = P_offd_data[ind]; P_offd_j[indp+nel_offd++] = P_offd_j[ind]; } } /* 3. Rescale row to conserve row sum */ if( row_sum_trunc != 0 ) { if( row_sum_trunc != row_sum ) { row_sum_trunc = row_sum/row_sum_trunc; for (ind = P_diag_i[i]; ind < P_diag_i[i]+nel_diag; ind++) P_diag_data[ind] *= row_sum_trunc; for (ind = P_offd_i[i]; ind < P_offd_i[i]+nel_offd; ind++) P_offd_data[ind] *= row_sum_trunc; } } /* 4. Remember number of elements of compressed matrix */ P_aux_diag_i[i] = nel_diag; P_aux_offd_i[i] = nel_offd; } } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGInterpTruncationDevice_dev2( HYPRE_Int num_rows_P, HYPRE_Int* P_diag_i, HYPRE_Int* P_offd_i, HYPRE_Int* P_aux_diag_i, HYPRE_Int* P_aux_offd_i ) /* Construct P_aux_diag_i and P_aux_offd_i from a non-truncated matrix. Input: num_rows_P - Number of rows of matrix in this MPI-task. P_diag_i - CSR vector I of P_diag. P_offd_i - CSR vector I of P_offd. Output: P_aux_diag_i - P_aux_diag_i[i] holds the number of elements on row i in P_diag. P_aux_offd_i - P_aux_offd_i[i] holds the number of elements on row i in P_offd. */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < num_rows_P ; i += nthreads ) P_aux_diag_i[i] = P_diag_i[i+1]-P_diag_i[i]; for( i = myid ; i < num_rows_P ; i += nthreads ) P_aux_offd_i[i] = P_offd_i[i+1]-P_offd_i[i]; } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGInterpTruncationDevice_dev3( HYPRE_Int num_rows_P, 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* P_aux_diag_i, HYPRE_Int* P_aux_offd_i, HYPRE_Int max_elements ) /* Perform truncation by retaining the max_elements largest (absolute value) elements of each row. The matrix is rescaled after truncation to conserve its row sums. Input: num_rows_P - Number of rows of matrix in this MPI-task. P_diag_i, P_diag_j, P_diag_data - CSR representation of block diagonal part of matrix P_offd_i, P_offd_j, P_offd_data - CSR representation of off-block diagonal part of matrix P_aux_diag_i - P_aux_diag_i[i] holds the number of non-truncated elements on row i in P_diag. P_aux_offd_i - P_aux_offd_i[i] holds the number of non-truncated elements on row i in P_offd. Output: P_aux_diag_i, P_aux_offd_i - Updated with the new number of elements per row, after truncation. P_diag_j, P_diag_data, P_offd_j, P_offd_data - Reordered so that the first P_aux_diag_i[i] and the first P_aux_offd_i[i] elements on each row form the truncated matrix. */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i, nel, ind, indo; HYPRE_Real row_sum, row_sum_trunc; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < num_rows_P ; i += nthreads ) { /* count number of elements in row */ nel = P_aux_diag_i[i]+P_aux_offd_i[i]; /* 0. Do we need to do anything ? */ if( nel > max_elements ) { /* 1. Save row sum before truncation, for rescaling below */ row_sum = 0; for (ind = P_diag_i[i]; ind < P_diag_i[i]+P_aux_diag_i[i]; ind++) row_sum += P_diag_data[ind]; for (ind = P_offd_i[i]; ind < P_offd_i[i]+P_aux_offd_i[i]; ind++) row_sum += P_offd_data[ind]; /* Sort in place, avoid allocation of extra array */ hypre_isort2abs_dev(&P_diag_j[P_diag_i[i]], &P_diag_data[P_diag_i[i]], P_aux_diag_i[i] ); if( P_aux_offd_i[i] > 0 ) hypre_isort2abs_dev(&P_offd_j[P_offd_i[i]], &P_offd_data[P_offd_i[i]], P_aux_offd_i[i] ); /* The routine hypre_qsort2abs(v,w,i0,i1) sorts (v,w) in decreasing order w.r.t w */ /* hypre_qsort2abs_dev(&P_diag_j[i], &P_diag_data[i], 0, P_aux_diag_i[i]-1 ); hypre_qsort2abs_dev(&P_offd_j[i], &P_offd_data[i], 0, P_aux_offd_i[i]-1 );*/ /* 2. Retain the max_elements largest elements, only index of last element needs to be computed, since data is now sorted */ nel = 0; ind =P_diag_i[i]; indo=P_offd_i[i]; /* 2a. Also, keep track of row sum of truncated matrix, for rescaling below */ row_sum_trunc = 0; while( nel < max_elements ) { if( ind < P_diag_i[i]+P_aux_diag_i[i] && indo < P_offd_i[i]+P_aux_offd_i[i] ) { if( fabs(P_diag_data[ind])>fabs(P_offd_data[indo]) ) { row_sum_trunc += P_diag_data[ind]; ind++; } else { row_sum_trunc += P_offd_data[indo]; indo++; } } else if( ind < P_diag_i[i]+P_aux_diag_i[i] ) { row_sum_trunc += P_diag_data[ind]; ind++; } else { row_sum_trunc += P_offd_data[indo]; indo++; } nel++; } /* 3. Remember new row sizes */ P_aux_diag_i[i] = ind-P_diag_i[i]; P_aux_offd_i[i] = indo-P_offd_i[i]; /* 4. Rescale row to conserve row sum */ if( row_sum_trunc != 0 ) { if( row_sum_trunc != row_sum ) { row_sum_trunc = row_sum/row_sum_trunc; for (ind = P_diag_i[i]; ind < P_diag_i[i]+P_aux_diag_i[i]; ind++) P_diag_data[ind] *= row_sum_trunc; for (ind = P_offd_i[i]; ind < P_offd_i[i]+P_aux_offd_i[i]; ind++) P_offd_data[ind] *= row_sum_trunc; } } } } } /*-----------------------------------------------------------------------*/ __global__ void hypre_BoomerAMGInterpTruncationDevice_dev4( HYPRE_Int num_rows_P, HYPRE_Int* P_diag_i, HYPRE_Int* P_diag_j, HYPRE_Real* P_diag_data, HYPRE_Int* P_diag_i_new, HYPRE_Int* P_diag_j_new, HYPRE_Real* P_diag_data_new, HYPRE_Int* P_offd_i, HYPRE_Int* P_offd_j, HYPRE_Real* P_offd_data, HYPRE_Int* P_offd_i_new, HYPRE_Int* P_offd_j_new, HYPRE_Real* P_offd_data_new ) /* Copy truncated matrix to smaller storage. In the previous kernels, the number of elements per row has been reduced, but the matrix is still stored in the old CSR arrays. Input: num_rows_P - Number of rows of matrix in this MPI-task. P_diag_i, P_diag_j, P_diag_data - CSR representation of block diagonal part of matrix P_offd_i, P_offd_j, P_offd_data - CSR representation of off-block diagonal part of matrix P_diag_i_new - P_diag has been truncated, this is the new CSR I-vector, pointing to beginnings of rows. P_offd_i_new - P_offd has been truncated, this is the new CSR I-vector, pointing to beginnings of rows. Output: P_diag_j_new, P_diag_data_new, P_offd_j_new, P_offd_data_new - These are the resized CSR arrays of the truncated matrix. */ { HYPRE_Int myid= threadIdx.x + blockIdx.x * blockDim.x, i, ind, indp, indo; const HYPRE_Int nthreads = gridDim.x * blockDim.x; for( i = myid ; i < num_rows_P ; i += nthreads ) { // indp = P_diag_i[i]; indp = P_diag_i[i]-P_diag_i_new[i]; for( ind = P_diag_i_new[i] ; ind < P_diag_i_new[i+1]; ind++ ) { // P_diag_j_new[ind] = P_diag_j[indp]; // P_diag_data_new[ind] = P_diag_data[indp++]; P_diag_j_new[ind] = P_diag_j[indp+ind]; P_diag_data_new[ind] = P_diag_data[indp+ind]; } // indo = P_offd_i[i]; indo = P_offd_i[i]-P_offd_i_new[i]; for( ind = P_offd_i_new[i] ; ind < P_offd_i_new[i+1]; ind++ ) { // P_offd_j_new[ind] = P_offd_j[indo]; // P_offd_data_new[ind] = P_offd_data[indo++]; P_offd_j_new[ind] = P_offd_j[indo+ind]; P_offd_data_new[ind] = P_offd_data[indo+ind]; } } } /*-----------------------------------------------------------------------*/ __device__ void hypre_swap2_dev(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; } /*-----------------------------------------------------------------------*/ /* sort both v and w, in place, but based only on entries in w */ /* Sorts in decreasing order */ __device__ void hypre_qsort2abs_dev( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int left, HYPRE_Int right ) { HYPRE_Int i, last; if (left >= right) return; hypre_swap2_dev( v, w, left, (left+right)/2); last = left; for (i = left+1; i <= right; i++) if (fabs(w[i]) > fabs(w[left])) { hypre_swap2_dev(v, w, ++last, i); } hypre_swap2_dev(v, w, left, last); hypre_qsort2abs_dev(v, w, left, last-1); hypre_qsort2abs_dev(v, w, last+1, right); } /*-----------------------------------------------------------------------*/ /* sort both v and w, in place, but based only on entries in w Sorts in decreasing order, insertion sort, slower than quicksort but avoids compiler warning message on stack size limit unknown. */ __device__ void hypre_isort2abs_dev( HYPRE_Int *v, HYPRE_Real *w, HYPRE_Int n ) { HYPRE_Int i, j, y; HYPRE_Real x; for( i=1 ; i < n ; i++ ) { x = w[i]; y = v[i]; j = i-1; while( j >= 0 && fabs(w[j]) < fabs(x) ) { w[j+1] = w[j]; v[j+1] = v[j]; j--; } w[j+1] = x; v[j+1] = y; } } #endif #endif /* #if defined(HYPRE_USING_CUDA) */ hypre-2.18.2/src/parcsr_ls/par_jacobi_interp.c000066400000000000000000000544441355566575400213700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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=0) ++CF_coarse; } #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=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; nc1=0; for ( i=0; incmin+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=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=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]; mvmax 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=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=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 ( i10 ) 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.18.2/src/parcsr_ls/par_laplace.c000066400000000000000000001237151355566575400201570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; #else HYPRE_Int nx_size, ny_size, nz_size; HYPRE_Int jx, jy, jz; global_part = hypre_CTAlloc(HYPRE_BigInt, P*Q*R+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jz = 0; jz < R; jz++) { nz_size = (HYPRE_Int)(nz_part[jz+1]-nz_part[jz]); for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size*nz_size); } } } #endif diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); } 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_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; HYPRE_BigInt *global_part; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; #else HYPRE_Int nx_size, ny_size, nz_size; HYPRE_Int jx, jy, jz; global_part = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jz = 0; jz < R; jz++) { nz_size = (HYPRE_Int)(nz_part[jz+1]-nz_part[jz]); for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size*nz_size); } } } gp_size = num_procs+1; #endif diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); if (num_procs > 1) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); } 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 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_SHARED); 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_SHARED); } 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 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); } 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_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.18.2/src/parcsr_ls/par_laplace_9pt.c000066400000000000000000000320241355566575400207430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; HYPRE_Real *offd_data; HYPRE_BigInt *global_part; HYPRE_BigInt ix, iy; HYPRE_Int cnt, o_cnt; HYPRE_Int local_num_rows; HYPRE_BigInt *col_map_offd; HYPRE_BigInt *big_offd_j; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); global_part[0] = ny_part[q]*nx + nx_part[p]*ny_local; global_part[1] = global_part[0]+(HYPRE_BigInt)local_num_rows; #else HYPRE_Int nx_size, ny_size; HYPRE_Int jx, jy; global_part = hypre_CTAlloc(HYPRE_BigInt, P*Q+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size); } } #endif diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); if (num_procs > 1) { offd_j = hypre_CTAlloc(HYPRE_Int, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_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.18.2/src/parcsr_ls/par_lr_interp.c000066400000000000000000005761171355566575400205640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; /* 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; HYPRE_Real wall_1 = 0; HYPRE_Real wall_2 = 0; HYPRE_Real wall_3 = 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_SHARED); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); } 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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_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_Int *col_offd_S_to_A, 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; /* 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_SHARED); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); 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 */ 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); } } /* 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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_Int *col_offd_S_to_A, 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; /*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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_SHARED); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_SHARED); 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); } if (P_offd_size) { P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); } 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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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_Int *col_offd_S_to_A, 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; /*HYPRE_Int ccounter_offd;*/ HYPRE_Int common_c; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; /* 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_HOST); 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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, 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_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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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_Int *col_offd_S_to_A, 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; /*HYPRE_Int ccounter_offd;*/ HYPRE_Int common_c; /* Full row information for columns of A that are off diag*/ hypre_CSRMatrix *A_ext; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; /* 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_HOST); 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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 */ if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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, 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_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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if (col_offd_S_to_A) i1 = col_offd_S_to_A[S_offd_j[jj]]; else 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_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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_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_Int *col_offd_S_to_A, 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; 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; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif 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, HYPRE_MEMORY_HOST); P_offd_i = hypre_CTAlloc(HYPRE_Int, n_fine+1, HYPRE_MEMORY_HOST); 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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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, 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_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++) { if (col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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 (col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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_ParCSRMatrixOwnsRowStarts(P) = 0; 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_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-2.18.2/src/parcsr_ls/par_lr_restr.c000066400000000000000000002075431355566575400204140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, hypre_ParCSRMatrix **R_ptr, HYPRE_Int AIR1_5, HYPRE_Int is_triangular, HYPRE_Int gmres_switch) { /* 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; /* 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; 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION /*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); #else /*my_first_cpt = num_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[k]] : 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 */ comm_pkg_SF = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm (comm_pkg_SF) = comm; hypre_ParCSRCommPkgNumSends (comm_pkg_SF) = num_sends; hypre_ParCSRCommPkgSendProcs (comm_pkg_SF) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(comm_pkg_SF) = send_SF_jstarts; hypre_ParCSRCommPkgNumRecvs (comm_pkg_SF) = num_recvs; hypre_ParCSRCommPkgRecvProcs (comm_pkg_SF) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_SF) = recv_SF_jstarts; /* 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[k]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 */ comm_pkg_FF2_j = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm (comm_pkg_FF2_j) = comm; hypre_ParCSRCommPkgNumSends (comm_pkg_FF2_j) = num_sends_FF2; hypre_ParCSRCommPkgSendProcs (comm_pkg_FF2_j) = hypre_ParCSRCommPkgSendProcs(comm_pkg_FF2_i); hypre_ParCSRCommPkgSendMapStarts(comm_pkg_FF2_j) = send_FF2_jstarts; hypre_ParCSRCommPkgNumRecvs (comm_pkg_FF2_j) = num_recvs_FF2; hypre_ParCSRCommPkgRecvProcs (comm_pkg_FF2_j) = hypre_ParCSRCommPkgRecvProcs(comm_pkg_FF2_i); hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_FF2_j) = recv_FF2_jstarts; /* 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[k]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[k]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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; /* R does not own ColStarts, since A does */ hypre_ParCSRMatrixOwnsColStarts(R) = 0; 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_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_Int *col_offd_S_to_A, hypre_ParCSRMatrix **R_ptr) { /* 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, i1, 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); /*-------------- global number of C points and my start position */ #ifdef HYPRE_NO_GLOBAL_PARTITION /*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); #else /*my_first_cpt = num_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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++) { i1 = AFF_diag_i[i]; /* make sure the first entry is diagonal */ hypre_assert(AFF_diag_j[i1] == i); /* !!! store the inverse */ HYPRE_Complex di = 1.0 / AFF_diag_a[i1]; diag_entries[i] = di; di = -di; AFF_diag_a[i1] = 0.0; for (j = i1+1; j < AFF_diag_i[i+1]; j++) { AFF_diag_a[j] *= di; } 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] *= di; } } } /* 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_ParcsrAdd(1.0, ACF, 1.0, X, &Z); hypre_ParCSRMatrixDestroy(X); } else { X = hypre_ParMatmul(AFF, AFF); hypre_ParcsrAdd(1.0, AFF, 1.0, X, &Z); for (i = 2; i < NeumannDeg; i++) { X2 = hypre_ParMatmul(X, AFF); hypre_ParcsrAdd(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_ParcsrAdd(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, HYPRE_MEMORY_HOST); R_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag, HYPRE_MEMORY_HOST); R_diag_a = 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_a = 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; 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; /* R does not own ColStarts, since A does */ hypre_ParCSRMatrixOwnsColStarts(R) = 0; 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-2.18.2/src/parcsr_ls/par_mgr.c000066400000000000000000002615051355566575400173430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /* Create */ void * hypre_MGRCreate() { hypre_ParMGRData *mgr_data; mgr_data = hypre_CTAlloc(hypre_ParMGRData, 1, HYPRE_MEMORY_HOST); /* block data */ (mgr_data -> block_size) = 1; (mgr_data -> num_coarse_indexes) = 1; (mgr_data -> block_num_coarse_indexes) = NULL; (mgr_data -> block_cf_marker) = NULL; /* general data */ (mgr_data -> max_num_coarse_levels) = 10; (mgr_data -> A_array) = NULL; (mgr_data -> P_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 -> 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 -> S_commpkg_switch) = 1.0; (mgr_data -> P_max_elmts) = 0; (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 -> omega) = 1.; (mgr_data -> max_iter) = 20; (mgr_data -> tol) = 1.0e-7; (mgr_data -> relax_type) = 0; (mgr_data -> relax_order) = 1; (mgr_data -> interp_type) = 2; (mgr_data -> restrict_type) = 0; (mgr_data -> num_relax_sweeps) = 1; (mgr_data -> relax_weight) = 1.0; (mgr_data -> logging) = 0; (mgr_data -> print_level) = 0; (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 -> diaginv) = NULL; (mgr_data -> global_smooth_iters) = 1; (mgr_data -> global_smooth_type) = 0; (mgr_data -> set_non_Cpoints_to_F) = 0; (mgr_data -> Frelax_method) = 0; (mgr_data -> FrelaxVcycleData) = NULL; (mgr_data -> max_local_lvls) = 10; (mgr_data -> print_coarse_system) = 0; return (void *) mgr_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* Destroy */ HYPRE_Int hypre_MGRDestroy( void *data ) { hypre_ParMGRData * mgr_data = (hypre_ParMGRData*) data; 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++) { if ((mgr_data -> block_cf_marker)[i]) { hypre_TFree((mgr_data -> block_cf_marker)[i], HYPRE_MEMORY_HOST); } } 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; } /* final residual vector */ if((mgr_data -> residual)) { hypre_ParVectorDestroy( (mgr_data -> residual) ); (mgr_data -> residual) = NULL; } if((mgr_data -> rel_res_norms)) { hypre_TFree( (mgr_data -> rel_res_norms) , HYPRE_MEMORY_HOST); (mgr_data -> rel_res_norms) = NULL; } /* 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++) if ((mgr_data -> l1_norms)[i]) hypre_TFree((mgr_data -> l1_norms)[i], HYPRE_MEMORY_HOST); 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++) if ((mgr_data -> coarse_indices_lvls)[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 -> 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 -> RT_array)[i-1]) hypre_ParCSRMatrixDestroy((mgr_data -> RT_array)[i-1]); hypre_TFree((mgr_data -> CF_marker_array)[i-1], HYPRE_MEMORY_HOST); } for (i=1; i < (num_coarse_levels); i++) { if ((mgr_data -> A_array)[i]) hypre_ParCSRMatrixDestroy((mgr_data -> A_array)[i]); } } if((mgr_data -> F_array)) { hypre_TFree((mgr_data -> F_array), HYPRE_MEMORY_HOST); (mgr_data -> F_array) = NULL; } if((mgr_data -> U_array)) { hypre_TFree((mgr_data -> U_array), HYPRE_MEMORY_HOST); (mgr_data -> U_array) = NULL; } if((mgr_data -> A_array)) { hypre_TFree((mgr_data -> A_array), HYPRE_MEMORY_HOST); (mgr_data -> A_array) = NULL; } if((mgr_data -> P_array)) { hypre_TFree((mgr_data -> P_array), HYPRE_MEMORY_HOST); (mgr_data -> P_array) = NULL; } if((mgr_data -> RT_array)) { hypre_TFree((mgr_data -> RT_array), HYPRE_MEMORY_HOST); (mgr_data -> RT_array) = NULL; } if((mgr_data -> CF_marker_array)) { hypre_TFree((mgr_data -> CF_marker_array), HYPRE_MEMORY_HOST); (mgr_data -> CF_marker_array) = NULL; } if((mgr_data -> reserved_Cpoint_local_indexes)) { hypre_TFree((mgr_data -> reserved_Cpoint_local_indexes), HYPRE_MEMORY_HOST); (mgr_data -> reserved_Cpoint_local_indexes) = NULL; } /* data for V-cycle F-relaxation */ if (mgr_data -> FrelaxVcycleData) { for (i = 0; i < num_coarse_levels; i++) { if ((mgr_data -> FrelaxVcycleData)[i]) { hypre_MGRDestroyFrelaxVcycleData((mgr_data -> FrelaxVcycleData)[i]); (mgr_data -> FrelaxVcycleData)[i] = NULL; } } hypre_TFree(mgr_data -> FrelaxVcycleData, HYPRE_MEMORY_HOST); mgr_data -> FrelaxVcycleData = NULL; } /* data for reserved coarse nodes */ if(mgr_data -> reserved_coarse_indexes) { hypre_TFree(mgr_data -> reserved_coarse_indexes, HYPRE_MEMORY_HOST); (mgr_data -> reserved_coarse_indexes) = NULL; } /* coarse level matrix - RAP */ if ((mgr_data -> RAP)) hypre_ParCSRMatrixDestroy((mgr_data -> RAP)); if ((mgr_data -> diaginv)) hypre_TFree((mgr_data -> diaginv), HYPRE_MEMORY_HOST); /* mgr data */ hypre_TFree(mgr_data, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* Create data for V-cycle F-relaxtion */ void * hypre_MGRCreateFrelaxVcycleData() { 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; 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); for (i=1; i < num_levels; i++) { hypre_ParVectorDestroy(hypre_ParAMGDataFArray(vdata)[i]); hypre_ParVectorDestroy(hypre_ParAMGDataUArray(vdata)[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_TFree(hypre_ParAMGDataCFMarkerArray(vdata)[i-1], HYPRE_MEMORY_HOST); } /* see comments in par_coarsen.c regarding special case for CF_marker */ if (num_levels == 1) { hypre_TFree(hypre_ParAMGDataCFMarkerArray(vdata)[0], HYPRE_MEMORY_HOST); } /* Points to vtemp 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); /* Points to ztemp of mgr_data, which is already destroyed */ /* if (hypre_ParAMGDataZtemp(vdata)) hypre_ParVectorDestroy(hypre_ParAMGDataZtemp(vdata)); */ if (hypre_ParAMGDataAMat(vdata)) hypre_TFree(hypre_ParAMGDataAMat(vdata), HYPRE_MEMORY_HOST); if (hypre_ParAMGDataBVec(vdata)) hypre_TFree(hypre_ParAMGDataBVec(vdata), HYPRE_MEMORY_HOST); if (hypre_ParAMGDataCommInfo(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; } /* Initialize/ set 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 0) { block_num_coarse_indexes = hypre_CTAlloc(HYPRE_Int, max_num_levels, HYPRE_MEMORY_HOST); for(i=0; i 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; 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_Int *reserved_cpt_index) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; HYPRE_BigInt *reserved_coarse_indexes = NULL; HYPRE_Int i; if (!mgr_data) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Warning! MGR object empty!\n"); return hypre_error_flag; } if(reserved_coarse_size < 0) { hypre_error_in_arg(2); return hypre_error_flag; } /* 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) = 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_Int **CF_marker, HYPRE_Int cflag) { HYPRE_Int *cf_marker, i, row, nc; HYPRE_Int *cindexes = fixed_coarse_indexes; HYPRE_Int nloc = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); /* If this is the last level, coarsen onto fixed coarse set */ if(cflag) { if(*CF_marker != NULL) { hypre_TFree(*CF_marker, HYPRE_MEMORY_HOST); } cf_marker = hypre_CTAlloc(HYPRE_Int, nloc, HYPRE_MEMORY_HOST); memset(cf_marker, FMRK, nloc*sizeof(HYPRE_Int)); /* first mark fixed coarse set */ nc = fixed_coarse_size; for(i = 0; i < nc; i++) { cf_marker[cindexes[i]] = CMRK; } } 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); /* 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 = 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]++; } } } } } } /*----------------------------------------------------------------------- * 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_SHARED); P_diag_j = hypre_CTAlloc(HYPRE_Int, P_diag_size, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, P_diag_size, HYPRE_MEMORY_SHARED); 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_SHARED); P_offd_j = hypre_CTAlloc(HYPRE_Int, P_offd_size, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); /*----------------------------------------------------------------------- * 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++) { 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]; if(method == 0) { P_diag_data[jj_counter] = 0.0; } else 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) { 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; } else 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; 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(0); } /* 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 blk_size, HYPRE_Int reserved_coarse_size, 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; 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_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; 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(); #ifdef HYPRE_NO_GLOBAL_PARTITION //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); #else //my_first_cpt = num_cpts_global[my_id]; total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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++] = 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(); //fine_to_coarse_offd = hypre_CTAlloc(HYPRE_Int, 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++) 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] = fine_to_coarse_offd[i1];*/ 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; 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(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); } /* Setup interpolation operator */ HYPRE_Int hypre_MGRBuildInterp(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 *col_offd_S_to_A, hypre_ParCSRMatrix **P, HYPRE_Int last_level, HYPRE_Int method, HYPRE_Int numsweeps) { // HYPRE_Int i; hypre_ParCSRMatrix *P_ptr = NULL; // HYPRE_Real jac_trunc_threshold = trunc_factor; // HYPRE_Real jac_trunc_threshold_minus = 0.5*jac_trunc_threshold; /* Build interpolation operator using (hypre default) */ if(!last_level) { hypre_MGRBuildP( A,CF_marker,num_cpts_global,2,debug_flag,&P_ptr); } /* Do Jacobi interpolation for last level */ else { if (method <3) { hypre_MGRBuildP( A,CF_marker,num_cpts_global,method,debug_flag,&P_ptr); /* Could do a few sweeps of Jacobi to further improve P */ //for(i=0; i block_size); HYPRE_Int reserved_coarse_size = (mgr_data -> reserved_coarse_size); 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_ParCSRMatrix *B; hypre_CSRMatrix *B_diag; HYPRE_Real *B_diag_data; HYPRE_Int *B_diag_i; HYPRE_Int *B_diag_j; hypre_CSRMatrix *B_offd; HYPRE_Int i,ii; HYPRE_Int j,jj; HYPRE_Int k; HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int n_block, left_size,inv_size; // HYPRE_Real wall_time; /* for debugging instrumentation */ HYPRE_Int bidx,bidxm1,bidxp1; HYPRE_Real * diaginv; const HYPRE_Int nb2 = blk_size*blk_size; HYPRE_Int block_scaling_error = 0; hypre_MPI_Comm_size(comm,&num_procs); hypre_MPI_Comm_rank(comm,&my_id); // HYPRE_Int num_threads = hypre_NumThreads(); //printf("n = %d\n",n); 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; //printf("inv_size = %d\n",inv_size); hypre_blockRelax_setup(A,blk_size,reserved_coarse_size,&(mgr_data -> diaginv)); // if (debug_flag==4) wall_time = time_getWallclockSeconds(); /*----------------------------------------------------------------------- * First Pass: Determine size of B and fill in *-----------------------------------------------------------------------*/ B_diag_i = hypre_CTAlloc(HYPRE_Int, n+1, HYPRE_MEMORY_HOST); B_diag_j = hypre_CTAlloc(HYPRE_Int, inv_size, HYPRE_MEMORY_HOST); B_diag_data = hypre_CTAlloc(HYPRE_Real, inv_size, HYPRE_MEMORY_HOST); B_diag_i[n] = inv_size; //B_offd_i = hypre_CTAlloc(HYPRE_Int, n+1, HYPRE_MEMORY_HOST); //B_offd_j = hypre_CTAlloc(HYPRE_Int, 1, HYPRE_MEMORY_HOST); //B_offd_data = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST); //B_offd_i[n] = 1; /*----------------------------------------------------------------- * Get all the diagonal sub-blocks *-----------------------------------------------------------------*/ diaginv = hypre_CTAlloc(HYPRE_Real, nb2, HYPRE_MEMORY_HOST); //printf("n_block = %d\n",n_block); for (i = 0;i < n_block; i++) { bidxm1 = i*blk_size; bidxp1 = (i+1)*blk_size; for (k = 0;k < blk_size; k++) { for (j = 0;j < blk_size; j++) { bidx = 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 && fabs(A_diag_data[ii]) > SMALLREAL) { bidx = 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 (k = 0;k < blk_size; k++) */ /* { */ /* for (j = 0;j < blk_size; j++) */ /* { */ /* bidx = k*blk_size + j; */ /* printf("diaginv[%d] = %e\n",bidx,diaginv[bidx]); */ /* } */ /* } */ hypre_blas_mat_inv(diaginv, blk_size); for (k = 0;k < blk_size; k++) { B_diag_i[i*blk_size+k] = i*nb2 + k*blk_size; //B_offd_i[i*nb2+k] = 0; 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] = diaginv[k*blk_size + j]; } } } //printf("Before create\n"); B = hypre_ParCSRMatrixCreate(comm, hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixGlobalNumCols(A), hypre_ParCSRMatrixRowStarts(A), hypre_ParCSRMatrixColStarts(A), 0, inv_size, 0); //printf("After create\n"); B_diag = hypre_ParCSRMatrixDiag(B); hypre_CSRMatrixData(B_diag) = B_diag_data; hypre_CSRMatrixI(B_diag) = B_diag_i; hypre_CSRMatrixJ(B_diag) = B_diag_j; B_offd = hypre_ParCSRMatrixOffd(B); hypre_CSRMatrixData(B_offd) = NULL; hypre_CSRMatrixI(B_offd) = NULL; hypre_CSRMatrixJ(B_offd) = NULL; /* hypre_ParCSRMatrixOwnsRowStarts(B) = 0; */ *B_ptr = B; return(block_scaling_error); } HYPRE_Int hypre_block_jacobi (hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Real blk_size, HYPRE_Int n_block, HYPRE_Int left_size, HYPRE_Real *diaginv, hypre_ParVector *Vtemp) { 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; 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; HYPRE_Int i, j, k; HYPRE_Int ii, jj; HYPRE_Int bidx,bidx1; HYPRE_Int relax_error = 0; 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 (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++) { 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]; 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++) { 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(relax_error); } /*Block smoother*/ HYPRE_Int hypre_blockRelax_setup(hypre_ParCSRMatrix *A, HYPRE_Int blk_size, HYPRE_Int reserved_coarse_size, HYPRE_Real **diaginvptr) { 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; } 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 && fabs(A_diag_data[ii]) > SMALLREAL) { 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++) { // FIX-ME: zero-diagonal should be tested previously if (fabs(diaginv[i]) < SMALLREAL) diaginv[i] = 0.0; else diaginv[i] = 1.0 / diaginv[i]; } } *diaginvptr = diaginv; return 1; } HYPRE_Int hypre_blockRelax(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u, HYPRE_Int blk_size, HYPRE_Int reserved_coarse_size, 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 relax_error = 0; 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 && fabs(A_diag_data[ii]) > SMALLREAL) { 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 (fabs(diaginv[i]) < SMALLREAL) diaginv[i] = 0.0; else diaginv[i] = 1.0 / diaginv[i]; } } hypre_block_jacobi(A,f,u,blk_size,n_block,left_size,diaginv,Vtemp); /*----------------------------------------------------------------- * Free temperary memeory *-----------------------------------------------------------------*/ hypre_TFree(diaginv, HYPRE_MEMORY_HOST); return(relax_error); } /* 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; if (!mgr_data) { hypre_error_in_arg(1); return hypre_error_flag; } (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; (mgr_data -> num_relax_sweeps) = nsweeps; 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; (mgr_data -> Frelax_method) = relax_method; 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; (mgr_data -> restrict_type) = 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; (mgr_data -> interp_type) = interpType; 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 print level for mgr solver */ HYPRE_Int hypre_MGRSetPrintLevel( void *mgr_vdata, HYPRE_Int print_level ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> print_level) = print_level; return hypre_error_flag; } /* Set print 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 solver */ HYPRE_Int hypre_MGRSetMaxGlobalsmoothIters( void *mgr_vdata, HYPRE_Int max_iter ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> global_smooth_iters) = max_iter; return hypre_error_flag; } /* Set max number of iterations for mgr solver */ HYPRE_Int hypre_MGRSetGlobalsmoothType( void *mgr_vdata, HYPRE_Int iter_type ) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; (mgr_data -> global_smooth_type) = iter_type; 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; if (!mgr_data) { hypre_error_in_arg(1); return hypre_error_flag; } *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; if (!mgr_data) { hypre_error_in_arg(1); return hypre_error_flag; } *res_norm = mgr_data->final_rel_residual_norm; return hypre_error_flag; } HYPRE_Int hypre_MGRBuildAff( 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) { hypre_error_in_arg(1); return hypre_error_flag; } 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) { hypre_error_in_arg(1); return hypre_error_flag; } 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) { hypre_error_in_arg(1); return hypre_error_flag; } 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; } /* Print solver params */ HYPRE_Int hypre_MGRWriteSolverParams(void *mgr_vdata) { hypre_ParMGRData *mgr_data = (hypre_ParMGRData*) mgr_vdata; hypre_printf("MGR Setup parameters: \n"); hypre_printf("Max number of coarse levels: %d\n", (mgr_data -> max_num_coarse_levels)); hypre_printf("Block size: %d\n", (mgr_data -> block_size)); hypre_printf("Number of coarse indexes: %d\n", (mgr_data -> num_coarse_indexes)); hypre_printf("reserved coarse nodes size: %d\n", (mgr_data -> reserved_coarse_size)); hypre_printf("\n MGR Solver Parameters: \n"); hypre_printf("F-relaxation Method: %d\n", (mgr_data -> Frelax_method)); hypre_printf("Relax type: %d\n", (mgr_data -> relax_type)); hypre_printf("Number of relax sweeps: %d\n", (mgr_data -> num_relax_sweeps)); hypre_printf("Interpolation type: %d\n", (mgr_data -> interp_type)); hypre_printf("Number of interpolation sweeps: %d\n", (mgr_data -> num_interp_sweeps)); hypre_printf("Restriction type: %d\n", (mgr_data -> restrict_type)); hypre_printf("Number of restriction sweeps: %d\n", (mgr_data -> num_restrict_sweeps)); hypre_printf("Global smoother type: %d\n", (mgr_data ->global_smooth_type)); hypre_printf("Number of global smoother sweeps: %d\n", (mgr_data ->global_smooth_iters)); hypre_printf("Max number of iterations: %d\n", (mgr_data -> max_iter)); hypre_printf("Stopping tolerance: %e\n", (mgr_data -> tol)); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_mgr.h000066400000000000000000000061771355566575400173520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 num_coarse_indexes; HYPRE_Int *block_num_coarse_indexes; 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 **P_array; hypre_ParCSRMatrix **RT_array; hypre_ParCSRMatrix *RAP; HYPRE_Int **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_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_Real **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 max_iter; HYPRE_Int relax_order; HYPRE_Int num_relax_sweeps; 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; HYPRE_Real omega; /* temp vectors for solve phase */ hypre_ParVector *Vtemp; hypre_ParVector *Ztemp; hypre_ParVector *Utemp; hypre_ParVector *Ftemp; HYPRE_Real *diaginv; HYPRE_Int n_block; HYPRE_Int left_size; HYPRE_Int global_smooth_iters; HYPRE_Int global_smooth_type; HYPRE_Solver global_smoother; /* 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; /* F-relaxation method */ HYPRE_Int Frelax_method; /* V-cycle F relaxation method */ hypre_ParAMGData **FrelaxVcycleData; HYPRE_Int max_local_lvls; HYPRE_Int print_coarse_system; } hypre_ParMGRData; #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 SMALLREAL 1e-20 #endif hypre-2.18.2/src/parcsr_ls/par_mgr_setup.c000066400000000000000000001024511355566575400205550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 cnt,i,j, final_coarse_size, block_size, idx, **block_cf_marker; HYPRE_BigInt row; HYPRE_Int lev, num_coarsening_levs, last_level, num_c_levels, num_threads,nc,index_i,cflag; HYPRE_Int debug_flag = 0; hypre_ParCSRMatrix *RT = NULL; hypre_ParCSRMatrix *P = NULL; hypre_ParCSRMatrix *S = NULL; hypre_ParCSRMatrix *ST = NULL; hypre_ParCSRMatrix *AT = NULL; HYPRE_Int * col_offd_S_to_A = NULL; HYPRE_Int * col_offd_ST_to_AT = NULL; HYPRE_Int * dof_func_buff = NULL; HYPRE_BigInt * coarse_pnts_global = NULL; HYPRE_Real **l1_norms = NULL; 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_interp_sweeps = (mgr_data -> num_interp_sweeps); HYPRE_Int num_restrict_sweeps = (mgr_data -> num_interp_sweeps); HYPRE_Int 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_Real S_commpkg_switch = (mgr_data -> S_commpkg_switch); 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_Int ** CF_marker_array = (mgr_data -> CF_marker_array); 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 *RAP_ptr = NULL; 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_Solver default_cg_solver; HYPRE_Int (*coarse_grid_solver_setup)(void*,void*,void*,void*) = (HYPRE_Int (*)(void*, void*, void*, void*)) (mgr_data -> coarse_grid_solver_setup); HYPRE_Int (*coarse_grid_solver_solve)(void*,void*,void*,void*) = (HYPRE_Int (*)(void*, void*, void*, void*)) (mgr_data -> coarse_grid_solver_solve); HYPRE_Int global_smooth_type = (mgr_data -> global_smooth_type); 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 blk_size = (mgr_data -> block_size); hypre_ParAMGData **FrelaxVcycleData = (mgr_data -> FrelaxVcycleData); HYPRE_Int Frelax_method = (mgr_data -> Frelax_method); /* ----- begin -----*/ num_threads = hypre_NumThreads(); block_size = (mgr_data -> block_size); block_cf_marker = (mgr_data -> block_cf_marker); 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_Int num_coarse_levels = (mgr_data -> max_num_coarse_levels); HYPRE_Int nloc = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(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); /* 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 */ coarse_grid_solver_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; coarse_grid_solver_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; (mgr_data -> coarse_grid_solver_setup) = coarse_grid_solver_setup; (mgr_data -> coarse_grid_solver_solve) = coarse_grid_solver_solve; (mgr_data -> coarse_grid_solver) = default_cg_solver; } // keep reserved coarse indexes to coarsest grid if((mgr_data -> reserved_Cpoint_local_indexes) != NULL) 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); cnt=0; for(i=0; icoarse_grid_solver), 25,reserved_coarse_size,reserved_Cpoint_local_indexes); } /* setup coarse grid solver */ // hypre_BoomerAMGSetMaxIter ( (mgr_data -> coarse_grid_solver), (mgr_data -> max_iter) ); // hypre_BoomerAMGSetPrintLevel((mgr_data -> coarse_grid_solver), 3); coarse_grid_solver_setup((mgr_data -> coarse_grid_solver), A, f, u); (mgr_data -> num_coarse_levels) = 0; return hypre_error_flag; } /* if ((mgr_data -> level_coarse_indexes) != NULL) { for(i=0; i level_coarse_indexes)[i] != NULL) { hypre_TFree((mgr_data -> level_coarse_indexes)[i], HYPRE_MEMORY_HOST); } } hypre_TFree((mgr_data -> level_coarse_indexes), HYPRE_MEMORY_HOST); (mgr_data -> level_coarse_indexes) = NULL; hypre_TFree((mgr_data -> num_coarse_per_level), HYPRE_MEMORY_HOST); (mgr_data -> num_coarse_per_level) = NULL; } */ /* 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); // loop over levels for(i=0; i reserved_Cpoint_local_indexes) != NULL) 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); // cnt=0; for(i=0; i 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 || P_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 (P_array[j]) { hypre_ParCSRMatrixDestroy(P_array[j]); P_array[j] = NULL; } if (RT_array[j]) { hypre_ParCSRMatrixDestroy(RT_array[j]); RT_array[j] = NULL; } if (CF_marker_array[j]) { hypre_TFree(CF_marker_array[j], HYPRE_MEMORY_HOST); CF_marker_array[j] = NULL; } } hypre_TFree(P_array, HYPRE_MEMORY_HOST); P_array = NULL; hypre_TFree(RT_array, HYPRE_MEMORY_HOST); RT_array = NULL; hypre_TFree(CF_marker_array, HYPRE_MEMORY_HOST); CF_marker_array = NULL; } /* Free previously allocated FrelaxVcycleData if not destroyed */ if(FrelaxVcycleData) { for (j = 0; j < old_num_coarse_levels; j++) { if (FrelaxVcycleData[j]) { hypre_MGRDestroyFrelaxVcycleData(FrelaxVcycleData[j]); FrelaxVcycleData[j] = NULL; } } hypre_TFree(FrelaxVcycleData, HYPRE_MEMORY_HOST); FrelaxVcycleData = NULL; } // reset pointer to NULL (mgr_data -> FrelaxVcycleData) = FrelaxVcycleData; /* 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 (my_id == num_procs) { mgr_data -> n_block = (n - reserved_coarse_size) / blk_size; mgr_data -> left_size = n - blk_size*(mgr_data -> n_block); } else { mgr_data -> n_block = n / blk_size; mgr_data -> left_size = n - blk_size*(mgr_data -> n_block); } if (global_smooth_type == 0) { hypre_blockRelax_setup(A,blk_size,reserved_coarse_size,&(mgr_data -> diaginv)); } else if (global_smooth_type == 8) { HYPRE_EuclidCreate(comm, &(mgr_data -> global_smoother)); HYPRE_EuclidSetLevel(mgr_data -> global_smoother, 0); HYPRE_EuclidSetBJ(mgr_data -> global_smoother, 1); HYPRE_EuclidSetup(mgr_data -> global_smoother, A, f, u); } /* 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_TFree((mgr_data -> l1_norms)[j], HYPRE_MEMORY_HOST); (mgr_data -> l1_norms)[j] = NULL; } } hypre_TFree((mgr_data -> l1_norms), 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; } if ((mgr_data -> rel_res_norms)) { hypre_TFree((mgr_data -> rel_res_norms), HYPRE_MEMORY_HOST); (mgr_data -> rel_res_norms) = NULL; } Vtemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Vtemp); hypre_ParVectorSetPartitioningOwner(Vtemp,0); (mgr_data ->Vtemp) = Vtemp; Ztemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ztemp); hypre_ParVectorSetPartitioningOwner(Ztemp,0); (mgr_data -> Ztemp) = Ztemp; Utemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Utemp); hypre_ParVectorSetPartitioningOwner(Utemp,0); (mgr_data ->Utemp) = Utemp; Ftemp = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(Ftemp); hypre_ParVectorSetPartitioningOwner(Ftemp,0); (mgr_data ->Ftemp) = Ftemp; /* Allocate memory for level structure */ if (A_array == NULL) A_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 (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_Int*, max_num_coarse_levels, HYPRE_MEMORY_HOST); /* set pointers to mgr data */ (mgr_data -> A_array) = A_array; (mgr_data -> P_array) = P_array; (mgr_data -> RT_array) = RT_array; (mgr_data -> CF_marker_array) = CF_marker_array; /* 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); /* 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; /* begin coarsening loop */ num_coarsening_levs = max_num_coarse_levels; /* initialize level data matrix here */ RAP_ptr = A; /* loop over levels of coarsening */ for(lev = 0; lev < num_coarsening_levs; lev++) { /* check if this is the last level */ last_level = ((lev == num_coarsening_levs-1)); /* initialize A_array */ A_array[lev] = RAP_ptr; nloc = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array[lev])); /* Compute strength matrix for interpolation operator - use default parameters, to be modified later */ hypre_BoomerAMGCreateS(A_array[lev], strong_threshold, max_row_sum, 1, NULL, &S); /* use appropriate communication package for Strength matrix */ if (strong_threshold > S_commpkg_switch) hypre_BoomerAMGCreateSCommPkg(A_array[lev],S,&col_offd_S_to_A); /* Coarsen: Build CF_marker array based on rows of A */ cflag = ((last_level || setNonCpointToF)); hypre_MGRCoarsen(S, A_array[lev], level_coarse_size[lev], level_coarse_indexes[lev],debug_flag, &CF_marker_array[lev], cflag); /* Get global coarse sizes. Note that we assume num_functions = 1 * so dof_func arrays are NULL */ hypre_BoomerAMGCoarseParms(comm, nloc, 1, NULL, CF_marker_array[lev], &dof_func_buff,&coarse_pnts_global); /* Compute Petrov-Galerkin operators */ /* Interpolation operator */ num_interp_sweeps = (mgr_data -> num_interp_sweeps); hypre_MGRBuildInterp(A_array[lev], CF_marker_array[lev], S, coarse_pnts_global, 1, dof_func_buff, debug_flag, trunc_factor, max_elmts, col_offd_S_to_A, &P, 1, interp_type, num_interp_sweeps); P_array[lev] = P; /* Build AT (transpose A) */ hypre_ParCSRMatrixTranspose(A_array[lev], &AT, 1); /* Build new strength matrix */ hypre_BoomerAMGCreateS(AT, strong_threshold, max_row_sum, 1, NULL, &ST); /* use appropriate communication package for Strength matrix */ if (strong_threshold > S_commpkg_switch) hypre_BoomerAMGCreateSCommPkg(AT, ST, &col_offd_ST_to_AT); num_restrict_sweeps = (mgr_data -> num_restrict_sweeps); /* restriction */ hypre_MGRBuildInterp(AT, CF_marker_array[lev], ST, coarse_pnts_global, 1, dof_func_buff, debug_flag, trunc_factor, max_elmts, col_offd_ST_to_AT, &RT, last_level, restrict_type, num_restrict_sweeps); RT_array[lev] = RT; /* Compute RAP for next level */ hypre_BoomerAMGBuildCoarseOperator(RT, A_array[lev], P, &RAP_ptr); /* Update coarse level indexes for next levels */ if (lev < num_coarsening_levs - 1) { // first mark indexes to be updated for(i=0; inum_coarse_levels) = num_c_levels; (mgr_data->RAP) = RAP_ptr; /* setup default coarse grid solver */ /* default is BoomerAMG */ if(use_default_cgrid_solver) { if (my_id==0) hypre_fprintf(stderr,"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_BoomerAMGSetRelaxOrder( default_cg_solver, 1); hypre_BoomerAMGSetPrintLevel(default_cg_solver, 0); /* set setup and solve functions */ coarse_grid_solver_setup = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSetup; coarse_grid_solver_solve = (HYPRE_Int (*)(void*, void*, void*, void*)) hypre_BoomerAMGSolve; (mgr_data -> coarse_grid_solver_setup) = coarse_grid_solver_setup; (mgr_data -> coarse_grid_solver_solve) = coarse_grid_solver_solve; (mgr_data -> coarse_grid_solver) = default_cg_solver; } // keep reserved coarse indexes to coarsest grid if(reserved_coarse_size > 0) HYPRE_BoomerAMGSetCpointsToKeep((mgr_data ->coarse_grid_solver), 25,reserved_coarse_size,reserved_Cpoint_local_indexes); /* setup coarse grid solver */ coarse_grid_solver_setup((mgr_data -> coarse_grid_solver), RAP_ptr, F_array[num_c_levels], U_array[num_c_levels]); /* Setup smoother for fine grid */ if ( relax_type == 8 || relax_type == 13 || relax_type == 14 || relax_type == 18 ) { l1_norms = hypre_CTAlloc(HYPRE_Real *, num_c_levels, HYPRE_MEMORY_HOST); (mgr_data -> l1_norms) = l1_norms; } for (j = 0; j < num_c_levels; j++) { if (num_threads == 1) { if (relax_type == 8 || relax_type == 13 || relax_type == 14) { if (relax_order) hypre_ParCSRComputeL1Norms(A_array[j], 4, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 4, NULL, &l1_norms[j]); } else if (relax_type == 18) { if (relax_order) hypre_ParCSRComputeL1Norms(A_array[j], 1, CF_marker_array[j], &l1_norms[j]); else hypre_ParCSRComputeL1Norms(A_array[j], 1, NULL, &l1_norms[j]); } } else { if (relax_type == 8 || relax_type == 13 || relax_type == 14) { if (relax_order) hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, CF_marker_array[j] , &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 4, num_threads, NULL, &l1_norms[j]); } else if (relax_type == 18) { if (relax_order) hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, CF_marker_array[j] , &l1_norms[j]); else hypre_ParCSRComputeL1NormsThreads(A_array[j], 1, num_threads, NULL, &l1_norms[j]); } } } /* Setup Vcycle data for Frelax_method > 0 */ if(Frelax_method == 1) { /* allocate memory and set pointer to (mgr_data -> FrelaxVcycleData) */ if(FrelaxVcycleData == NULL) FrelaxVcycleData = hypre_CTAlloc(hypre_ParAMGData*, max_num_coarse_levels, HYPRE_MEMORY_HOST); (mgr_data -> FrelaxVcycleData) = FrelaxVcycleData; /* loop over levels */ for(i=0; i<(mgr_data->num_coarse_levels); i++) { FrelaxVcycleData[i] = (hypre_ParAMGData*) hypre_MGRCreateFrelaxVcycleData(); (FrelaxVcycleData[i] -> Vtemp) = Vtemp; (FrelaxVcycleData[i] -> Ztemp) = Ztemp; // 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); } } if ( logging > 1 ) { residual = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A_array[0]), hypre_ParCSRMatrixGlobalNumRows(A_array[0]), hypre_ParCSRMatrixRowStarts(A_array[0]) ); hypre_ParVectorInitialize(residual); hypre_ParVectorSetPartitioningOwner(residual,0); (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 FrelaxVcycleData; 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 min_local_coarse_size = 0; HYPRE_Int max_local_coarse_size = 2; HYPRE_Int ge_relax_type = 9; HYPRE_Int **CF_marker_array = (mgr_data -> CF_marker_array); HYPRE_Int local_size; HYPRE_Int local_coarse_size; HYPRE_BigInt *coarse_pnts_global_lvl = NULL; HYPRE_Int *coarse_dof_func_lvl = NULL; hypre_ParCSRMatrix *RAP_local = NULL; hypre_ParCSRMatrix *P_local = NULL; hypre_ParCSRMatrix *S_local = NULL; HYPRE_Int smrk_local = -1; HYPRE_Int old_num_levels = (FrelaxVcycleData[lev] -> num_levels); HYPRE_Int **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_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm,&my_id); local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(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_TFree(CF_marker_array_local[j], HYPRE_MEMORY_HOST); 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_Int*, max_local_lvls, HYPRE_MEMORY_HOST); A_array_local[0] = A; F_array_local[0] = f; U_array_local[0] = u; /* Special case max_local_lvls == 1 */ if (max_local_lvls == 1) { CF_marker_local = hypre_CTAlloc(HYPRE_Int, local_size , HYPRE_MEMORY_HOST); for (i=0; i < local_size ; i++) CF_marker_local[i] = 1; CF_marker_array_local[0] = CF_marker_local; lev_local = max_local_lvls; not_finished = 0; } while (not_finished) { local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A_array_local[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], 0.25, 0.9, CF_marker_array[lev], smrk_local, &S_local); } else if (lev_local > 0) { hypre_BoomerAMGCreateS(A_array_local[lev_local], 0.25, 0.9, 1, NULL, &S_local); } // hypre_BoomerAMGCoarsenFalgout(S_local, A_array_local[lev_local], 0, 0, &CF_marker_local); hypre_BoomerAMGCoarsen(S_local, A_array_local[lev_local], 0, 0, &CF_marker_local); /* For the lev_local=0, the coarsening routine is called on the fine-grid (the whole matrix) * thus, some C-points of the outer MGR level may have been set to F-points in the coarsening * routine. We need to reset these back to C-points (before building the interpolation operator. */ if (lev_local == 0) { for (i = 0; i < local_size; i++) { if (CF_marker_array[lev][i] == 1) { CF_marker_local[i] = 1; } } } hypre_BoomerAMGCoarseParms(comm, local_size, 1, NULL, CF_marker_local, &coarse_dof_func_lvl, &coarse_pnts_global_lvl); 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 and interpolation matrix pointers */ CF_marker_array_local[lev_local] = CF_marker_local; P_array_local[lev_local] = P_local; /* build the coarse grid */ hypre_BoomerAMGBuildCoarseOperatorKT(P_local, A_array_local[lev_local], P_local, 0, &RAP_local); // hypre_printf("Coarse size lev %d = %d\n", lev_local+1, hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(RAP_local))); #ifdef HYPRE_NO_GLOBAL_PARTITION if (my_id == (num_procs -1)) local_coarse_size = coarse_pnts_global_lvl[1]; hypre_MPI_Bcast(&local_coarse_size, 1, HYPRE_MPI_BIG_INT, num_procs-1, comm); #else local_coarse_size = coarse_pnts_global_lvl[num_procs]; #endif lev_local++; if (S_local) hypre_ParCSRMatrixDestroy(S_local); S_local = NULL; if ( (lev_local == max_local_lvls-1) || (local_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]); hypre_ParVectorSetPartitioningOwner(F_array_local[lev_local], 0); 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]); hypre_ParVectorSetPartitioningOwner(U_array_local[lev_local], 0); } // 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+1; if(lev_local > 1) hypre_GaussElimSetup(FrelaxVcycleData[lev], lev_local, ge_relax_type); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_mgr_solve.c000066400000000000000000000524371355566575400205550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; HYPRE_Real alpha = -1; HYPRE_Real beta = 1; 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_Int Solve_err_flag; /* HYPRE_Real total_coeffs; HYPRE_Real total_variables; HYPRE_Real operat_cmplxty; HYPRE_Real grid_cmplxty; */ 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_Int blk_size = (mgr_data -> block_size); HYPRE_Real *diaginv = (mgr_data -> diaginv); HYPRE_Int n_block = (mgr_data -> n_block); HYPRE_Int left_size = (mgr_data -> left_size); HYPRE_Int global_smooth_iters = (mgr_data -> global_smooth_iters); HYPRE_Int global_smooth_type = (mgr_data -> global_smooth_type); HYPRE_Int i; 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; return hypre_error_flag; } 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 *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1) hypre_MGRWriteSolverParams(mgr_data); /*----------------------------------------------------------------------- * Initialize the solver error flag and assorted bookkeeping variables *-----------------------------------------------------------------------*/ Solve_err_flag = 0; /* total_coeffs = 0; total_variables = 0; operat_cmplxty = 0; grid_cmplxty = 0; */ /*----------------------------------------------------------------------- * write some initial info *-----------------------------------------------------------------------*/ if (my_id == 0 && print_level > 1 && tol > 0.) hypre_printf("\n\nTWO-GRID SOLVER SOLUTION INFO:\n"); /*----------------------------------------------------------------------- * Compute initial fine-grid residual and print *-----------------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { if ( logging > 1 ) { hypre_ParVectorCopy(F_array[0], residual ); if (tol > 0.0) hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, residual ); resnorm = sqrt(hypre_ParVectorInnerProd( residual, residual )); } else { hypre_ParVectorCopy(F_array[0], Vtemp); if (tol > 0.0) hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, Vtemp); resnorm = sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } /* Since it is 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); return hypre_error_flag; } init_resnorm = resnorm; rhs_norm = sqrt(hypre_ParVectorInnerProd(f, f)); if (rhs_norm) { rel_resnorm = init_resnorm / rhs_norm; } else { /* rhs is zero, return a zero solution */ hypre_ParVectorSetConstantValues(U_array[0], 0.0); if(logging > 0) { rel_resnorm = 0.0; (mgr_data -> final_rel_residual_norm) = 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); } /************** Main Solver Loop - always do 1 iteration ************/ iter = 0; while ((rel_resnorm >= tol || iter < 1) && iter < max_iter) { if (global_smooth_iters) { if (global_smooth_type == 0)//block Jacobi smoother { for (i = 0;i < global_smooth_iters;i ++) hypre_block_jacobi(A_array[0],F_array[0],U_array[0],blk_size,n_block,left_size,diaginv,Vtemp); } else if ((global_smooth_type > 0) && (global_smooth_type < 7)) { for (i = 0;i < global_smooth_iters;i ++) hypre_BoomerAMGRelax(A_array[0], F_array[0], NULL, global_smooth_type-1, 0, 1.0, 0.0, NULL, U_array[0], Vtemp, NULL); } else if (global_smooth_type == 8)//EUCLID ILU smoother { for (i = 0;i < global_smooth_iters;i ++) { // compute residual hypre_ParCSRMatrixMatvecOutOfPlace(alpha, A_array[0], U_array[0], beta, F_array[0], Vtemp); // solve HYPRE_EuclidSolve( (mgr_data -> global_smoother),A_array[0],Vtemp,Utemp); // update solution hypre_ParVectorAxpy(beta, Utemp, U_array[0]); } } } /* Do one cycle of reduction solve on Ae=r */ hypre_MGRCycle(mgr_data, F_array, U_array); /*--------------------------------------------------------------- * Compute fine-grid residual and residual norm *----------------------------------------------------------------*/ if (print_level > 1 || logging > 1 || tol > 0.) { old_resnorm = resnorm; if ( logging > 1 ) { hypre_ParVectorCopy(F_array[0], residual); hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, residual ); resnorm = sqrt(hypre_ParVectorInnerProd( residual, residual )); } else { hypre_ParVectorCopy(F_array[0], Vtemp); hypre_ParCSRMatrixMatvec(alpha, A_array[0], U_array[0], beta, Vtemp); resnorm = sqrt(hypre_ParVectorInnerProd(Vtemp, Vtemp)); } if (old_resnorm) conv_factor = resnorm / old_resnorm; else conv_factor = resnorm; if (rhs_norm) { rel_resnorm = resnorm / rhs_norm; } else { rel_resnorm = 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 > 1) { 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.) { 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 = pow((resnorm/init_resnorm),(1.0/(HYPRE_Real) iter)); else conv_factor = 1.; if (print_level > 1) { /*** compute operator and grid complexities 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(" Number of coarse levels = %d \n",(mgr_data -> num_coarse_levels)); // 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); } } return hypre_error_flag; } 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 = 1; HYPRE_Int level = 0; HYPRE_Int cycle_param = 1; HYPRE_Int j, Solve_err_flag, local_size, coarse_grid, fine_grid; HYPRE_Int num_sweeps = 1; HYPRE_Int relax_order = 1; HYPRE_Int relax_type = 3; HYPRE_Int relax_weight = 1; HYPRE_Int omega = 1; 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_Int **CF_marker_array = ((Frelax_data) -> CF_marker_array); hypre_ParVector *Vtemp = (Frelax_data) -> Vtemp; hypre_ParVector *Ztemp = (Frelax_data) -> Ztemp; HYPRE_Int num_c_levels = (Frelax_data) -> num_levels-1; hypre_ParVector *Aux_F = NULL; hypre_ParVector *Aux_U = NULL; HYPRE_Real alpha, beta; while (Not_Finished) { local_size = hypre_VectorSize(hypre_ParVectorLocalVector(F_array[level])); hypre_VectorSize(hypre_ParVectorLocalVector(Vtemp)) = local_size; Aux_F = F_array[level]; Aux_U = U_array[level]; if (cycle_param == 1) { // visiting coarser grids and relax // This also doubles as the smoother used when no // coarsening is done for (j = 0; j < num_sweeps; j++) { Solve_err_flag = hypre_BoomerAMGRelaxIF(A_array[level], Aux_F, CF_marker_array[level], relax_type, relax_order, cycle_param, relax_weight, omega, NULL, Aux_U, Vtemp, Ztemp); } if ((num_c_levels > 0) && (level != num_c_levels)) { fine_grid = level; coarse_grid = level + 1; hypre_ParVectorSetConstantValues(U_array[coarse_grid], 0.0); alpha = -1.0; beta = 1.0; // 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); alpha = 1.0; beta = 0.0; hypre_ParCSRMatrixMatvecT(alpha,R_array[fine_grid],Vtemp, beta,F_array[coarse_grid]); ++level; cycle_param = 1; if (level == num_c_levels) cycle_param = 3; } } else if (cycle_param == 3) { // solve the coarsest grid with Gaussian elimination hypre_GaussElimSolve(Frelax_data, level, 9); 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; alpha = 1.0; beta = 1.0; hypre_ParCSRMatrixMatvec(alpha, P_array[fine_grid], U_array[coarse_grid], beta, U_array[fine_grid]); --level; cycle_param = 2; if (level == 0) cycle_param = 99; } else { Not_Finished = 0; } } return Solve_err_flag; } 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_Int Solve_err_flag; HYPRE_Int level; HYPRE_Int coarse_grid; HYPRE_Int fine_grid; HYPRE_Int Not_Finished; HYPRE_Int cycle_type; 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 *RAP = (mgr_data -> RAP); 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_Int **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_Real **relax_l1_norms = (mgr_data -> l1_norms); hypre_ParVector *Vtemp = (mgr_data -> Vtemp); hypre_ParVector *Ztemp = (mgr_data -> Ztemp); HYPRE_Int i, relax_points; HYPRE_Int num_coarse_levels = (mgr_data -> num_coarse_levels); HYPRE_Real alpha; HYPRE_Real beta; HYPRE_Int Frelax_method = (mgr_data -> Frelax_method); hypre_ParAMGData **FrelaxVcycleData = (mgr_data -> FrelaxVcycleData); /* Initialize */ // comm = hypre_ParCSRMatrixComm(A_array[0]); Solve_err_flag = 0; Not_Finished = 1; cycle_type = 1; level = 0; /***** Main loop ******/ while (Not_Finished) { /* Do coarse grid correction solve */ if(cycle_type == 3) { /* call coarse grid solver here */ /* default is BoomerAMG */ coarse_grid_solver_solve(cg_solver, RAP, F_array[level], U_array[level]); // DEBUG: print the coarse system indicated by mgr_data ->print_coarse_system if(mgr_data -> print_coarse_system) { HYPRE_ParCSRMatrixPrint(RAP, "RAP_mat"); HYPRE_ParVectorPrint(F_array[level], "RAP_rhs"); HYPRE_ParVectorPrint(U_array[level], "RAP_sol"); mgr_data -> print_coarse_system--; } /**** cycle up ***/ cycle_type = 2; } /* F-relaxation */ else if(cycle_type == 1) { fine_grid = level; coarse_grid = level + 1; /* Relax solution - F-relaxation */ relax_points = -1; if (Frelax_method == 0) { /* (single level) relaxation for A_ff */ if (relax_type == 18) { for(i=0; i 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; n_SF_offd = 0; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:n_coarse_offd,n_SF_offd) HYPRE_SMP_SCHEDULE #endif for (i=0; i < num_cols_offd; i++) if (CF_marker_offd[i] == 1) n_coarse_offd++; else if (CF_marker_offd[i] == -3) n_SF_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); if (col_offd_S_to_A) { map_A_to_S = hypre_CTAlloc(HYPRE_Int, num_cols_offd_A, HYPRE_MEMORY_HOST); for (i=0; i < num_cols_offd_A; i++) { if (cnt < num_cols_offd && col_map_offd_A[i] == col_map_offd[cnt]) map_A_to_S[i] = cnt++; else map_A_to_S[i] = -1; } } /*----------------------------------------------------------------------- * 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) { tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); 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 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. */ 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, HYPRE_MEMORY_SHARED); P_diag_data = hypre_CTAlloc(HYPRE_Real, total_nz, HYPRE_MEMORY_SHARED); if (total_nz_offd) { P_offd_j = hypre_CTAlloc(HYPRE_Int, total_nz_offd, HYPRE_MEMORY_SHARED); P_offd_data = hypre_CTAlloc(HYPRE_Real, total_nz_offd, HYPRE_MEMORY_SHARED); } 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. */ 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++) { if (col_offd_S_to_A) j1 = map_A_to_S[A_offd_j[j]]; else 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 (!col_offd_S_to_A) hypre_TFree(map_A_to_new);*/ 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. */ 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++) { if (col_offd_S_to_A) j1 = map_A_to_S[A_offd_j[j]]; else 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 */ 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++) { if (col_offd_S_to_A) j1 = map_A_to_S[A_offd_j[j]]; else 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 */ 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++) { if (col_offd_S_to_A) j1 = map_A_to_S[A_offd_j[j]]; else 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) 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); hypre_TFree(map_A_to_S, 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; hypre_ParCSRMatrixOwnsRowStarts(P) = 0; /* 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-2.18.2/src/parcsr_ls/par_nodal_systems.c000066400000000000000000001143601355566575400214360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 @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) { 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; HYPRE_BigInt *col_map_offd_AN; HYPRE_BigInt *new_col_map_offd; HYPRE_BigInt *row_starts_AN; 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; HYPRE_Int num_recvs; HYPRE_Int *send_procs; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts = NULL; HYPRE_Int *new_send_map_elmts; HYPRE_Int *recv_procs; HYPRE_Int *recv_vec_starts; hypre_ParCSRCommPkg *comm_pkg_AN; HYPRE_Int *send_procs_AN; HYPRE_Int *send_map_starts_AN; HYPRE_Int *send_map_elmts_AN; HYPRE_Int *recv_procs_AN; HYPRE_Int *recv_vec_starts_AN; 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; HYPRE_Int *counter; HYPRE_Real sum; HYPRE_Real *data; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts_AN = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; #else row_starts_AN = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; 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 = row_starts_AN[num_procs]; #endif 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, HYPRE_MEMORY_HOST); 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, HYPRE_MEMORY_HOST); AN_diag_data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_diag, HYPRE_MEMORY_HOST); 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] = 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] = fabs(A_diag_data[k]); index++; } else { AN_diag_data[counter[k_map]] += fabs(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 (fabs(A_diag_data[k]) > fabs(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] = fabs(A_diag_data[k]); index++; } else { data[(counter[k_map])*num_functions + j] += fabs(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, HYPRE_MEMORY_HOST); num_cols_offd_AN = 0; if (comm_pkg) { comm_pkg_AN = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_AN) = comm; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_ParCSRCommPkgNumSends(comm_pkg_AN) = num_sends; num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); hypre_ParCSRCommPkgNumRecvs(comm_pkg_AN) = num_recvs; 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; } hypre_ParCSRCommPkgSendProcs(comm_pkg_AN) = send_procs_AN; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_AN) = send_map_starts_AN; hypre_ParCSRCommPkgSendMapElmts(comm_pkg_AN) = send_map_elmts_AN; hypre_ParCSRCommPkgRecvProcs(comm_pkg_AN) = recv_procs_AN; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_AN) = recv_vec_starts_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 = NULL; col_map_offd_AN = NULL; 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, HYPRE_MEMORY_HOST); AN_offd_data = hypre_CTAlloc(HYPRE_Real, AN_num_nonzeros_offd, HYPRE_MEMORY_HOST); 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] = 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] = fabs(A_offd_data[k]); index++; } else { AN_offd_data[counter[k_map]] += fabs(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 (fabs(A_offd_data[k]) > fabs(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] = fabs(A_offd_data[k]); index++; } else { data[(counter[k_map])*num_functions + j] += fabs(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; } hypre_TFree(map_to_map, HYPRE_MEMORY_HOST); } 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) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(AN_offd) = HYPRE_MEMORY_HOST; 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); return hypre_error_flag; } /* This creates a scalar version of the CF_marker, dof_array and strength matrix (SN) */ HYPRE_Int hypre_BoomerAMGCreateScalarCFS(hypre_ParCSRMatrix *SN, HYPRE_Int *CFN_marker, HYPRE_Int *col_offd_SN_to_AN, HYPRE_Int num_functions, HYPRE_Int nodal, HYPRE_Int data, HYPRE_Int **dof_func_ptr, HYPRE_Int **CF_marker_ptr, HYPRE_Int **col_offd_S_to_A_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_Real *S_diag_data; hypre_CSRMatrix *S_offd; HYPRE_Int *S_offd_i; HYPRE_Int *S_offd_j; HYPRE_Real *S_offd_data; HYPRE_BigInt *row_starts_S; HYPRE_BigInt *col_starts_S; HYPRE_BigInt *row_starts_SN = hypre_ParCSRMatrixRowStarts(SN); HYPRE_BigInt *col_starts_SN = hypre_ParCSRMatrixColStarts(SN); 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_Real *SN_diag_data; 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_Real *SN_offd_data = NULL; HYPRE_Int *CF_marker; HYPRE_BigInt *col_map_offd_SN = hypre_ParCSRMatrixColMapOffd(SN); HYPRE_BigInt *col_map_offd_S; HYPRE_Int *dof_func; HYPRE_Int num_nodes = hypre_CSRMatrixNumRows(SN_diag); HYPRE_Int num_variables; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(SN); 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_S; HYPRE_Int *send_procs_S; HYPRE_Int *send_map_starts_S; HYPRE_Int *send_map_elmts_S; HYPRE_Int *recv_procs_S; HYPRE_Int *recv_vec_starts_S; HYPRE_Int *col_offd_S_to_A = NULL; HYPRE_Int num_coarse_nodes; HYPRE_Int i,j,k,k1,jj,cnt; HYPRE_BigInt big_k1; HYPRE_Int row, start, end; HYPRE_Int num_procs; HYPRE_Int num_cols_offd_SN = hypre_CSRMatrixNumCols(SN_offd); HYPRE_Int num_cols_offd_S; HYPRE_Int SN_num_nonzeros_diag; HYPRE_Int SN_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_MPI_Comm_size(comm, &num_procs); num_variables = num_functions*num_nodes; CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); 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 = hypre_CTAlloc(HYPRE_Int, num_coarse_nodes*num_functions, HYPRE_MEMORY_HOST); 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; } } *dof_func_ptr = dof_func; } else { cnt = 0; for (i=0; i < num_nodes; i++) for (j=0; j < num_functions; j++) CF_marker[cnt++] = CFN_marker[i]; } *CF_marker_ptr = CF_marker; #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts_S = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i=0; i < 2; i++) row_starts_S[i] = (HYPRE_BigInt)num_functions*row_starts_SN[i]; if (row_starts_SN != col_starts_SN) { col_starts_S = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i=0; i < 2; i++) col_starts_S[i] = (HYPRE_BigInt)num_functions*col_starts_SN[i]; } else { col_starts_S = row_starts_S; } #else row_starts_S = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) row_starts_S[i] = (HYPRE_BigInt)num_functions*row_starts_SN[i]; if (row_starts_SN != col_starts_SN) { col_starts_S = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) col_starts_S[i] = (HYPRE_BigInt)num_functions*col_starts_SN[i]; } else { col_starts_S = row_starts_S; } #endif SN_num_nonzeros_diag = SN_diag_i[num_nodes]; SN_num_nonzeros_offd = SN_offd_i[num_nodes]; 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_num_nonzeros_diag = num_functions*SN_num_nonzeros_diag; S_num_nonzeros_offd = num_functions*SN_num_nonzeros_offd; num_cols_offd_S = num_functions*num_cols_offd_SN; S = hypre_ParCSRMatrixCreate(comm, global_num_vars, global_num_cols, row_starts_S, col_starts_S, num_cols_offd_S, S_num_nonzeros_diag, S_num_nonzeros_offd); S_diag = hypre_ParCSRMatrixDiag(S); S_offd = hypre_ParCSRMatrixOffd(S); hypre_CSRMatrixMemoryLocation(S_diag) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(S_offd) = HYPRE_MEMORY_HOST; S_diag_i = hypre_CTAlloc(HYPRE_Int, num_variables+1, HYPRE_MEMORY_HOST); S_offd_i = hypre_CTAlloc(HYPRE_Int, num_variables+1, HYPRE_MEMORY_HOST); S_diag_j = hypre_CTAlloc(HYPRE_Int, S_num_nonzeros_diag, HYPRE_MEMORY_HOST); hypre_CSRMatrixI(S_diag) = S_diag_i; hypre_CSRMatrixJ(S_diag) = S_diag_j; if (data) { SN_diag_data = hypre_CSRMatrixData(SN_diag); S_diag_data = hypre_CTAlloc(HYPRE_Real, S_num_nonzeros_diag, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(S_diag) = S_diag_data; if (num_cols_offd_S) { SN_offd_data = hypre_CSRMatrixData(SN_offd); S_offd_data = hypre_CTAlloc(HYPRE_Real, S_num_nonzeros_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixData(S_offd) = S_offd_data; } } hypre_CSRMatrixI(S_offd) = S_offd_i; if (comm_pkg) { comm_pkg_S = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_S) = comm; num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); hypre_ParCSRCommPkgNumSends(comm_pkg_S) = num_sends; num_recvs = hypre_ParCSRCommPkgNumRecvs(comm_pkg); hypre_ParCSRCommPkgNumRecvs(comm_pkg_S) = num_recvs; 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_S = NULL; send_map_elmts_S = NULL; if (num_sends) { send_procs_S = hypre_CTAlloc(HYPRE_Int, num_sends, HYPRE_MEMORY_HOST); send_map_elmts_S = hypre_CTAlloc(HYPRE_Int, num_functions*send_map_starts[num_sends], HYPRE_MEMORY_HOST); } send_map_starts_S = hypre_CTAlloc(HYPRE_Int, num_sends+1, HYPRE_MEMORY_HOST); recv_vec_starts_S = hypre_CTAlloc(HYPRE_Int, num_recvs+1, HYPRE_MEMORY_HOST); recv_procs_S = NULL; if (num_recvs) recv_procs_S = hypre_CTAlloc(HYPRE_Int, num_recvs, HYPRE_MEMORY_HOST); send_map_starts_S[0] = 0; for (i=0; i < num_sends; i++) { send_procs_S[i] = send_procs[i]; send_map_starts_S[i+1] = num_functions*send_map_starts[i+1]; } recv_vec_starts_S[0] = 0; for (i=0; i < num_recvs; i++) { recv_procs_S[i] = recv_procs[i]; recv_vec_starts_S[i+1] = num_functions*recv_vec_starts[i+1]; } cnt = 0; for (i=0; i < send_map_starts[num_sends]; i++) { k1 = num_functions*send_map_elmts[i]; for (j=0; j < num_functions; j++) { send_map_elmts_S[cnt++] = k1+j; } } hypre_ParCSRCommPkgSendProcs(comm_pkg_S) = send_procs_S; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_S) = send_map_starts_S; hypre_ParCSRCommPkgSendMapElmts(comm_pkg_S) = send_map_elmts_S; hypre_ParCSRCommPkgRecvProcs(comm_pkg_S) = recv_procs_S; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_S) = recv_vec_starts_S; hypre_ParCSRMatrixCommPkg(S) = comm_pkg_S; } if (num_cols_offd_S) { S_offd_j = hypre_CTAlloc(HYPRE_Int, S_num_nonzeros_offd, HYPRE_MEMORY_HOST); hypre_CSRMatrixJ(S_offd) = S_offd_j; col_map_offd_S = hypre_CTAlloc(HYPRE_BigInt, num_cols_offd_S, HYPRE_MEMORY_HOST); cnt = 0; for (i=0; i < num_cols_offd_SN; i++) { big_k1 = col_map_offd_SN[i]*(HYPRE_BigInt)num_functions; for (j=0; j < num_functions; j++) col_map_offd_S[cnt++] = big_k1+(HYPRE_BigInt)j; } hypre_ParCSRMatrixColMapOffd(S) = col_map_offd_S; } if (col_offd_SN_to_AN) { col_offd_S_to_A = hypre_CTAlloc(HYPRE_Int, num_cols_offd_S, HYPRE_MEMORY_HOST); cnt = 0; for (i=0; i < num_cols_offd_SN; i++) { k1 = col_offd_SN_to_AN[i]*num_functions; for (j=0; j < num_functions; j++) col_offd_S_to_A[cnt++] = k1+j; } *col_offd_S_to_A_ptr = col_offd_S_to_A; } cnt = 0; row = 0; for (i=0; i < num_nodes; i++) { row++; start = cnt; for (j=SN_diag_i[i]; j < SN_diag_i[i+1]; j++) { jj = SN_diag_j[j]; if (data) S_diag_data[cnt] = SN_diag_data[j]; S_diag_j[cnt++] = jj*num_functions; } end = cnt; S_diag_i[row] = cnt; for (k1=1; k1 < num_functions; k1++) { row++; for (k=start; k < end; k++) { if (data) S_diag_data[cnt] = S_diag_data[k]; S_diag_j[cnt++] = S_diag_j[k]+k1; } S_diag_i[row] = cnt; } } cnt = 0; row = 0; for (i=0; i < num_nodes; i++) { row++; start = cnt; for (j=SN_offd_i[i]; j < SN_offd_i[i+1]; j++) { jj = SN_offd_j[j]; if (data) S_offd_data[cnt] = SN_offd_data[j]; S_offd_j[cnt++] = jj*num_functions; } end = cnt; S_offd_i[row] = cnt; for (k1=1; k1 < num_functions; k1++) { row++; for (k=start; k < end; k++) { if (data) S_offd_data[cnt] = S_offd_data[k]; S_offd_j[cnt++] = S_offd_j[k]+k1; } S_offd_i[row] = cnt; } } *S_ptr = S; return hypre_error_flag; } /* This function just finds the scalaer CF_marker and dof_func */ HYPRE_Int hypre_BoomerAMGCreateScalarCF(HYPRE_Int *CFN_marker, HYPRE_Int num_functions, HYPRE_Int num_nodes, HYPRE_Int **dof_func_ptr, HYPRE_Int **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; CF_marker = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); 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 = hypre_CTAlloc(HYPRE_Int, num_coarse_nodes*num_functions, HYPRE_MEMORY_HOST); 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; } } *dof_func_ptr = dof_func; *CF_marker_ptr = CF_marker; return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_nongalerkin.c000066400000000000000000002664541355566575400210750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /* 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 0; } /* 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; 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); /* row_starts is owned by A, col_starts = row_starts */ hypre_ParCSRMatrixSetRowStartsOwner(S,0); 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 ((fabs(row_sum) > fabs(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_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_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, j, duplicate, cnt_new, rowcounter_new, prev_row; HYPRE_Int row_loc; HYPRE_BigInt row_start, row_stop, row; 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, HYPRE_MEMORY_HOST); cols_new = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); rownums_new = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); numcols_new = hypre_CTAlloc(HYPRE_Int, ijbuf_size, HYPRE_MEMORY_HOST); 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 = (*ijbuf_numcols)[row_loc-1]; row_stop = (*ijbuf_numcols)[row_loc]; } else { row_start = 0; row_stop = (*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, HYPRE_MEMORY_HOST); hypre_TFree(*ijbuf_cols, HYPRE_MEMORY_HOST); hypre_TFree(*ijbuf_rownums, HYPRE_MEMORY_HOST); hypre_TFree(*ijbuf_numcols, HYPRE_MEMORY_HOST); (*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; 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(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; 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(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); /* 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_Int ierr = 0; HYPRE_Real max_entry = 0.0; HYPRE_Real max_entry_offd = 0.0; HYPRE_Int * rownz = NULL; HYPRE_Int i, j, Cpt; HYPRE_BigInt row_start, row_end, global_row, global_col; /* 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 */ ierr += HYPRE_IJMatrixCreate(comm, first_col_diag_RAP, last_col_diag_RAP, first_col_diag_RAP, last_col_diag_RAP, &Pattern); ierr += HYPRE_IJMatrixSetObjectType(Pattern, HYPRE_PARCSR); rownz = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for(i = 0; i < num_variables; i++) { rownz[i] = 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); ierr += 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, HYPRE_MEMORY_HOST); ijbuf_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, HYPRE_MEMORY_HOST); hypre_NonGalerkinIJBigBufferInit( &ijbuf_cnt, &ijbuf_rowcounter, ijbuf_cols ); if(sym_collapse) { ijbuf_sym_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_rownums= hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_numcols= hypre_CTAlloc(HYPRE_Int, ijbuf_size, HYPRE_MEMORY_HOST); 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 < fabs(RAP_diag_data[j]) ) ) { max_entry = fabs(RAP_diag_data[j]); } } for(j = RAP_offd_i[i]; j < RAP_offd_i[i+1]; j++) { { if( max_entry < fabs(RAP_offd_data[j]) ) { max_entry = fabs(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( fabs(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( fabs(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 */ ierr += HYPRE_IJMatrixAssemble(Pattern); ierr += HYPRE_IJMatrixGetObject( Pattern, (void**) &Pattern_CSR ); /* Deallocate */ ierr += HYPRE_IJMatrixSetObjectType(Pattern, -1); ierr += HYPRE_IJMatrixDestroy(Pattern); hypre_TFree(ijbuf_data, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_cols, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_rownums, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_numcols, HYPRE_MEMORY_HOST); if(sym_collapse) { hypre_TFree(ijbuf_sym_data, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_cols, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_rownums, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_numcols, HYPRE_MEMORY_HOST); } 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_Real S_commpkg_switch, 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 *col_offd_S_to_A = NULL; HYPRE_Int i, j, k, row_start, row_end, value, num_cols_offd_Sext, num_procs; HYPRE_Int S_ext_diag_size, S_ext_offd_size, last_col_diag_RAP, cnt_offd, cnt_diag, cnt; HYPRE_Int col_indx_Pattern, current_Pattern_j, col_indx_RAP; /* HYPRE_Real start_time = hypre_MPI_Wtime(); */ /* HYPRE_Real end_time; */ HYPRE_BigInt *temp = NULL; HYPRE_Int ierr = 0; char filename[256]; /* 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); HYPRE_BigInt global_num_vars = hypre_ParCSRMatrixGlobalNumRows(RAP); /* 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; /* 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); } /*if (0)*/ /*(strong_threshold > S_commpkg_switch)*/ /*{ hypre_BoomerAMG_MyCreateSCommPkg(RAP, S, &col_offd_S_to_A); }*/ /* 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 + 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; */ if (num_cols_offd_Sext) 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 */ ierr += HYPRE_IJMatrixCreate(comm, first_col_diag_RAP, last_col_diag_RAP, first_col_diag_RAP, last_col_diag_RAP, &ijmatrix); ierr += HYPRE_IJMatrixSetObjectType(ijmatrix, HYPRE_PARCSR); rownz = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_HOST); for(i = 0; i < num_variables; i++) { rownz[i] = 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); ierr += 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, HYPRE_MEMORY_HOST); ijbuf_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_rownums = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_numcols = hypre_CTAlloc(HYPRE_Int, ijbuf_size, HYPRE_MEMORY_HOST); hypre_NonGalerkinIJBigBufferInit( &ijbuf_cnt, &ijbuf_rowcounter, ijbuf_cols ); if(sym_collapse) { ijbuf_sym_data = hypre_CTAlloc(HYPRE_Real, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_cols = hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_rownums= hypre_CTAlloc(HYPRE_BigInt, ijbuf_size, HYPRE_MEMORY_HOST); ijbuf_sym_numcols= hypre_CTAlloc(HYPRE_Int, ijbuf_size, HYPRE_MEMORY_HOST); 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 = 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 += fabs(diag_intersection_data[k]); } for(k = 0; k < offd_intersection_len; k++) { sum_strong_neigh += fabs(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 * fabs(diag_intersection_data[k])*sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * fabs(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 * fabs(offd_intersection_data[k])*sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * fabs(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 += fabs(diag_intersection_data[k]); } for(k = 0; k < offd_intersection_len; k++) { sum_strong_neigh += fabs(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 * fabs(diag_intersection_data[k])*sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * fabs(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 * fabs(offd_intersection_data[k])*sum_strong_neigh; diagonal_lump_value = (1.0 - lump_percent) * fabs(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*/ ierr += HYPRE_IJMatrixAssemble (ijmatrix); ierr += HYPRE_IJMatrixGetObject( ijmatrix, (void**) RAP_ptr); /* Optional diagnostic matrix printing */ if (0) { 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); } /* Free matrices and variables and arrays */ hypre_TFree(ijbuf_data, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_cols, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_rownums, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_numcols, HYPRE_MEMORY_HOST); if(sym_collapse) { hypre_TFree(ijbuf_sym_data, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_cols, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_rownums, HYPRE_MEMORY_HOST); hypre_TFree(ijbuf_sym_numcols, HYPRE_MEMORY_HOST); } 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); if (S_ext_diag_size) { hypre_TFree(S_ext_diag_j, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_diag_data, HYPRE_MEMORY_HOST); } if (S_ext_offd_size) { hypre_TFree(S_ext_offd_j, HYPRE_MEMORY_HOST); hypre_TFree(S_ext_offd_data, HYPRE_MEMORY_HOST); } if (num_cols_offd_Sext) { hypre_TFree(col_map_offd_Sext, HYPRE_MEMORY_HOST); } if (0) /*(strong_threshold > S_commpkg_switch)*/ { hypre_TFree(col_offd_S_to_A, HYPRE_MEMORY_HOST); } ierr += hypre_ParCSRMatrixDestroy(Pattern); ierr += hypre_ParCSRMatrixDestroy(RAP); ierr += hypre_ParCSRMatrixDestroy(S); ierr += HYPRE_IJMatrixSetObjectType(ijmatrix, -1); ierr += HYPRE_IJMatrixDestroy(ijmatrix); /*end_time = hypre_MPI_Wtime(); if(my_id == 0) { fprintf(stdout, "NonGalerkin Time: %1.2e\n", end_time-start_time); } */ return ierr; } hypre-2.18.2/src/parcsr_ls/par_rap.c000066400000000000000000002347261355566575400173450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #include "hypre_hopscotch_hash.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_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_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; HYPRE_Int *send_map_elmts_RT; 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_diag_A = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int num_cols_offd_A = 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_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(P); 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_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_Real *RAP_int_data; HYPRE_Int *RAP_int_i; HYPRE_BigInt *RAP_int_j; hypre_CSRMatrix *RAP_ext; HYPRE_Real *RAP_ext_data = NULL; HYPRE_Int *RAP_ext_i = NULL; HYPRE_BigInt *RAP_ext_j = NULL; hypre_CSRMatrix *RAP_diag; HYPRE_Real *RAP_diag_data; HYPRE_Int *RAP_diag_i; HYPRE_Int *RAP_diag_j; hypre_CSRMatrix *RAP_offd; HYPRE_Real *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_Real *R_diag_data; HYPRE_Int *R_diag_i; HYPRE_Int *R_diag_j; hypre_CSRMatrix *R_offd; HYPRE_Real *R_offd_data; HYPRE_Int *R_offd_i; HYPRE_Int *R_offd_j; 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; HYPRE_Real *Ps_ext_data; HYPRE_Int *Ps_ext_i; HYPRE_BigInt *Ps_ext_j; HYPRE_Real *P_ext_diag_data = NULL; HYPRE_Int *P_ext_diag_i = NULL; HYPRE_Int *P_ext_diag_j = NULL; HYPRE_Real *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; 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; 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) 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]; } 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++) { 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, HYPRE_MEMORY_SHARED); RAP_offd_i = hypre_TAlloc(HYPRE_Int, num_cols_diag_RT+1, HYPRE_MEMORY_SHARED); 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, HYPRE_MEMORY_SHARED); RAP_diag_j = hypre_CTAlloc(HYPRE_Int, RAP_diag_size, HYPRE_MEMORY_SHARED); } RAP_offd_size = jj_count_offd; if (RAP_offd_size) { RAP_offd_data = hypre_CTAlloc(HYPRE_Real, RAP_offd_size, HYPRE_MEMORY_SHARED); RAP_offd_j = hypre_CTAlloc(HYPRE_Int, RAP_offd_size, HYPRE_MEMORY_SHARED); } 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; } /*----------------------------------------------------------------------- * 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); /* Have RAP own coarse_partitioning instead of P */ hypre_ParCSRMatrixSetColStartsOwner(P,0); hypre_ParCSRMatrixSetColStartsOwner(RT,0); 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(0); } hypre-2.18.2/src/parcsr_ls/par_rap_communication.c000066400000000000000000000303751355566575400222640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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 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); comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(comm_pkg) = num_sends_RT; hypre_ParCSRCommPkgNumRecvs(comm_pkg) = num_recvs_RT; hypre_ParCSRCommPkgSendProcs(comm_pkg) = send_procs_RT; hypre_ParCSRCommPkgRecvProcs(comm_pkg) = recv_procs_RT; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg) = recv_vec_starts_RT; hypre_ParCSRCommPkgSendMapStarts(comm_pkg) = send_map_starts_RT; hypre_ParCSRCommPkgSendMapElmts(comm_pkg) = send_map_elmts_RT; 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; 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); comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(comm_pkg) = num_sends; hypre_ParCSRCommPkgNumRecvs(comm_pkg) = num_recvs; hypre_ParCSRCommPkgSendProcs(comm_pkg) = send_procs; hypre_ParCSRCommPkgRecvProcs(comm_pkg) = recv_procs; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg) = recv_vec_starts; hypre_ParCSRCommPkgSendMapStarts(comm_pkg) = send_map_starts; hypre_ParCSRCommPkgSendMapElmts(comm_pkg) = send_map_elmts; 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 0; } hypre-2.18.2/src/parcsr_ls/par_relax.c000066400000000000000000005443231355566575400176730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "../sstruct_ls/gselim.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 ) { 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; HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_Int n = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_BigInt first_ind = 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_Real *Vtemp_data; if (relax_type != 10) { Vtemp_local = hypre_ParVectorLocalVector(Vtemp); Vtemp_data = hypre_VectorData(Vtemp_local); } HYPRE_Real *Vext_data = NULL; HYPRE_Real *v_buf_data = NULL; HYPRE_Real *tmp_data; hypre_Vector *Ztemp_local; HYPRE_Real *Ztemp_data; 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, j, jr; HYPRE_Int ii, jj; HYPRE_Int ns, ne, size, rest; HYPRE_Int column; HYPRE_Int relax_error = 0; HYPRE_Int num_sends; HYPRE_Int num_recvs; HYPRE_Int index, start; HYPRE_Int num_procs, num_threads, my_id, ip, p; HYPRE_Int vec_start, vec_len; hypre_MPI_Status *status; hypre_MPI_Request *requests; HYPRE_Real *A_mat; HYPRE_Real *b_vec; HYPRE_Real zero = 0.0; HYPRE_Real res, res0, res2; HYPRE_Real one_minus_weight; HYPRE_Real one_minus_omega; HYPRE_Real prod; 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(); /*----------------------------------------------------------------------- * 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 * relax_type = 8 -> hybrid L1 Symm. Gauss-Seidel * relax_type = 10 -> On-processor direct forward solve for matrices with * triangular structure (indices need not be ordered * triangular) * 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 * relax_type = 9, 99, 98 -> Direct solve, Gaussian elimination * relax_type = 19-> Direct Solve, (old version) * relax_type = 29-> Direct solve: use gaussian elimination & BLAS * (with pivoting) (old version) *-----------------------------------------------------------------------*/ switch (relax_type) { case 0: /* Weighted Jacobi */ { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); /* printf("!! Proc %d: n %d, num_sends %d, num_cols_offd %d\n", my_id, n, num_sends, num_cols_offd); */ 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. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_points == 0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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) { 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] * 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] * Vext_data[ii]; } u_data[i] *= one_minus_weight; u_data[i] += relax_weight * res / A_diag_data[A_diag_i[i]]; } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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 && 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] * 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] * Vext_data[ii]; } u_data[i] *= one_minus_weight; u_data[i] += relax_weight * res / A_diag_data[A_diag_i[i]]; } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; case 5: /* Hybrid: Jacobi off-processor, chaotic Gauss-Seidel on-processor */ { 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_points == 0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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 && 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; /* Hybrid: Jacobi off-processor, Gauss-Seidel on-processor (forward loop) */ case 3: { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } #if defined(HYPRE_USING_PERSISTENT_COMM) // JSP: persistent comm can be similarly used for other smoothers hypre_ParCSRPersistentCommHandle *persistent_comm_handle; #endif if (num_procs > 1) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif 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); Vext_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); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); #endif if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } 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++) { v_buf_data[i-begin] = u_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 #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, Vext_data); #endif /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #if defined(HYPRE_USING_PERSISTENT_COMM) hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_HOST, Vext_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif comm_handle = NULL; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RELAX] -= hypre_MPI_Wtime(); #endif if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( 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]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && 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]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } else { 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 && 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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 = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } else { 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 && A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } } #ifndef HYPRE_USING_PERSISTENT_COMM if (num_procs > 1) { hypre_TFree(Vext_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 } break; case 1: /* Gauss-Seidel VERY SLOW */ { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(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); 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); if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ /* for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } */ } /*----------------------------------------------------------------- * 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_REAL, 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(&Vext_data[vec_start], vec_len, HYPRE_MPI_REAL, ip, 0, comm, &requests[jr++]); } hypre_MPI_Waitall(jr,requests,status); } if (relax_points == 0) { 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) { 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } /*----------------------------------------------------------------- * 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 && 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] * Vext_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(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } } break; case 2: /* Gauss-Seidel: relax interior points in parallel, boundary sequentially */ { if (num_procs > 1) { num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); num_recvs = hypre_ParCSRCommPkgNumRecvs(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); 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); if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ /* for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } */ /*----------------------------------------------------------------- * Relax interior points first *-----------------------------------------------------------------*/ if (relax_points == 0) { for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ((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]]; } } } 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 && (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_REAL, 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(&Vext_data[vec_start], vec_len, HYPRE_MPI_REAL, ip, 0, comm, &requests[jr++]); } hypre_MPI_Waitall(jr,requests,status); } if (relax_points == 0) { for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ((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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } /*----------------------------------------------------------------- * 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 && (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] * Vext_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(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); } } break; case 4: /* Hybrid: Jacobi off-processor, Gauss-Seidel/SOR on-processor (backward loop) */ { 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else { for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } /*----------------------------------------------------------------- * 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = 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 && 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]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else { 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 && 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else { for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } /*----------------------------------------------------------------- * 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[i]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,j,jj,ns,ne,res,res0,res2,rest,size) HYPRE_SMP_SCHEDULE #endif 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 = 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 && A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } hypre_TFree(tmp_data, HYPRE_MEMORY_HOST); } else { 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 && A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; case 6: /* Hybrid: Jacobi off-processor, Symm. Gauss-Seidel/ SSOR on-processor with outer relaxation parameter */ { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( 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]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && 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]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } 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 && 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]; if (ii >= ns && ii < ne) { res -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } else { 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 && 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } 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 && 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] * Vext_data[ii]; } u_data[i] = res / A_diag_data[A_diag_i[i]]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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 = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[i]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,j,jj,ns,ne,res,res0,res2,rest,size) HYPRE_SMP_SCHEDULE #endif 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. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[i]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,j,jj,ns,ne,res,res0,res2,rest,size) HYPRE_SMP_SCHEDULE #endif 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 && A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } 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 && A_diag_data[A_diag_i[i]] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } else { 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 && A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } 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 && A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / A_diag_data[A_diag_i[i]]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / A_diag_data[A_diag_i[i]];*/ } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; case 7: /* Jacobi (uses ParMatvec) */ { /*----------------------------------------------------------------- * Copy f into temporary vector. *-----------------------------------------------------------------*/ hypre_SeqVectorPrefetch(hypre_ParVectorLocalVector(Vtemp), HYPRE_MEMORY_DEVICE); hypre_SeqVectorPrefetch(hypre_ParVectorLocalVector(f), HYPRE_MEMORY_DEVICE); hypre_ParVectorCopy(f, Vtemp); /*----------------------------------------------------------------- * Perform Matvec Vtemp=f-Au *-----------------------------------------------------------------*/ hypre_ParCSRMatrixMatvec(-relax_weight,A, u, relax_weight, Vtemp); #if defined(HYPRE_USING_CUDA) hypreDevice_IVAXPY(n, l1_norms, Vtemp_data, u_data); #else for (i = 0; i < n; i++) { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ u_data[i] += Vtemp_data[i] / l1_norms[i]; } #endif } break; case 8: /* hybrid L1 Symm. Gauss-Seidel */ { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else { res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else { res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else { res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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 = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } for (i = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } 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 && l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } 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 && l1_norms[i] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; /* Hybrid: Jacobi off-processor, ordered Gauss-Seidel on-processor */ case 10: { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } #ifdef HYPRE_USING_PERSISTENT_COMM // JSP: persistent comm can be similarly used for other smoothers hypre_ParCSRPersistentCommHandle *persistent_comm_handle; #endif if (num_procs > 1) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); #ifdef HYPRE_USING_PERSISTENT_COMM persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(1, comm_pkg); v_buf_data = (HYPRE_Real *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); Vext_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); Vext_data = hypre_CTAlloc(HYPRE_Real, num_cols_offd, HYPRE_MEMORY_HOST); #endif if (num_cols_offd) { A_offd_j = hypre_CSRMatrixJ(A_offd); A_offd_data = hypre_CSRMatrixData(A_offd); } 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++) { v_buf_data[i - begin] = u_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 #ifdef 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, Vext_data); #endif /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_HOST, Vext_data); #else hypre_ParCSRCommHandleDestroy(comm_handle); #endif comm_handle = NULL; #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif } // Check for ordering of matrix. If stored, get pointer, otherwise // compute ordering and point matrix variable to array. HYPRE_Int *proc_ordering; if (!hypre_ParCSRMatrixProcOrdering(A)) { proc_ordering = hypre_CTAlloc(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; } else { proc_ordering = hypre_ParCSRMatrixProcOrdering(A); } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_RELAX] -= hypre_MPI_Wtime(); #endif if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 */ { HYPRE_Int row = proc_ordering[i]; /*----------------------------------------------------------- * If diagonal is nonzero, relax point row; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[row]] != zero) { res = f_data[row]; for (jj = A_diag_i[row]+1; jj < A_diag_i[row+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_data[ii]; } for (jj = A_offd_i[row]; jj < A_offd_i[row+1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * Vext_data[ii]; } u_data[row] = res / A_diag_data[A_diag_i[row]]; } } } } else { for (i = 0; i < n; i++) /* interior points first */ { HYPRE_Int row = proc_ordering[i]; /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( A_diag_data[A_diag_i[row]] != zero) { res = f_data[row]; for (jj = A_diag_i[row]+1; jj < A_diag_i[row+1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[row]; jj < A_offd_i[row+1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * Vext_data[ii]; } u_data[row] = res / A_diag_data[A_diag_i[row]]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 */ { HYPRE_Int row = proc_ordering[i]; /*----------------------------------------------------------- * If row is of the right type ( C or F ) and diagonal is * nonzero, relax point row; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[row] == relax_points && A_diag_data[A_diag_i[row]] != zero) { res = f_data[row]; for (jj = A_diag_i[row]+1; jj < A_diag_i[row+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) res -= A_diag_data[jj] * u_data[ii]; else res -= A_diag_data[jj] * tmp_data[ii]; } for (jj = A_offd_i[row]; jj < A_offd_i[row+1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * Vext_data[ii]; } u_data[row] = res / A_diag_data[A_diag_i[row]]; } } } } else { for (i = 0; i < n; i++) /* relax interior points */ { HYPRE_Int row = proc_ordering[i]; /*----------------------------------------------------------- * If row is of the right type ( C or F ) and diagonal is * nonzero, relax point row; otherwise, skip it. *-----------------------------------------------------------*/ if (cf_marker[row] == relax_points && A_diag_data[A_diag_i[row]] != zero) { res = f_data[row]; for (jj = A_diag_i[row]+1; jj < A_diag_i[row+1]; jj++) { ii = A_diag_j[jj]; res -= A_diag_data[jj] * u_data[ii]; } for (jj = A_offd_i[row]; jj < A_offd_i[row+1]; jj++) { ii = A_offd_j[jj]; res -= A_offd_data[jj] * Vext_data[ii]; } u_data[row] = res / A_diag_data[A_diag_i[row]]; } } } } #ifndef HYPRE_USING_PERSISTENT_COMM if (num_procs > 1) { hypre_TFree(Vext_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 } break; case 13: /* hybrid L1 Gauss-Seidel forward solve */ { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else { res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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 = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { for (i = 0; i < n; i++) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 && l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; case 14: /* hybrid L1 Gauss-Seidel backward solve */ { if (num_threads > 1) { Ztemp_local = hypre_ParVectorLocalVector(Ztemp); Ztemp_data = hypre_VectorData(Ztemp_local); } /*----------------------------------------------------------------- * Copy current approximation into temporary vector. *-----------------------------------------------------------------*/ 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. *-----------------------------------------------------------------*/ hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_weight == 1 && omega == 1) { if (relax_points == 0) { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += res / l1_norms[i]; } } } } } else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif 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 = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = ne-1; i > ns-1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; 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]; res2 += A_diag_data[jj] * Vtemp_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { for (i = n-1; i > -1; i--) /* interior points first */ { /*----------------------------------------------------------- * If diagonal is nonzero, relax point i; otherwise, skip it. *-----------------------------------------------------------*/ if ( l1_norms[i] != zero) { res0 = 0.0; res = f_data[i]; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { if (num_threads > 1) { tmp_data = Ztemp_data; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) tmp_data[i] = u_data[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 < 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 = 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 && l1_norms[i] != zero) { res0 = 0.0; res2 = 0.0; res = f_data[i]; for (jj = A_diag_i[i]+1; jj < A_diag_i[i+1]; jj++) { ii = A_diag_j[jj]; if (ii >= ns && ii < ne) { res2 += A_diag_data[jj] * Vtemp_data[ii]; res0 -= A_diag_data[jj] * u_data[ii]; } else res -= A_diag_data[jj] * tmp_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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } else { 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 && l1_norms[i] != zero) { res = f_data[i]; res0 = 0.0; res2 = 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]; res2 += 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] * Vext_data[ii]; } u_data[i] *= prod; u_data[i] += relax_weight*(omega*res + res0 + one_minus_omega*res2) / l1_norms[i]; /*u_data[i] += omega*(relax_weight*res + res0 + one_minus_weight*res2) / l1_norms[i];*/ } } } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } } break; case 19: /* Direct solve: use gaussian elimination */ { HYPRE_Int n_global = (HYPRE_Int) global_num_rows; HYPRE_Int first_index = (HYPRE_Int) first_ind; /*----------------------------------------------------------------- * Generate CSR matrix from ParCSRMatrix A *-----------------------------------------------------------------*/ #ifdef HYPRE_NO_GLOBAL_PARTITION /* all processors are needed for these routines */ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); #endif if (n) { #ifndef HYPRE_NO_GLOBAL_PARTITION A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); #endif 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 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[i*n_global+column] = 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION else { hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } #endif } break; case 98: /* Direct solve: use gaussian elimination & BLAS (with pivoting) */ { HYPRE_Int n_global = (HYPRE_Int) global_num_rows; HYPRE_Int first_index = (HYPRE_Int) first_ind; HYPRE_Int info; HYPRE_Int one_i = 1; HYPRE_Int *piv; /*----------------------------------------------------------------- * Generate CSR matrix from ParCSRMatrix A *-----------------------------------------------------------------*/ #ifdef HYPRE_NO_GLOBAL_PARTITION /* all processors are needed for these routines */ A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); #endif if (n) { #ifndef HYPRE_NO_GLOBAL_PARTITION A_CSR = hypre_ParCSRMatrixToCSRMatrixAll(A); f_vector = hypre_ParVectorToVectorAll(f); #endif 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 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++) { /* need col major */ column = A_CSR_j[jj]; A_mat[i + n_global*column] = A_CSR_data[jj]; } b_vec[i] = f_vector_data[i]; } piv = hypre_CTAlloc(HYPRE_Int, n_global, HYPRE_MEMORY_HOST); /* write over A with LU */ hypre_dgetrf(&n_global, &n_global, A_mat, &n_global, piv, &info); /*now b_vec = inv(A)*b_vec */ hypre_dgetrs("N", &n_global, &one_i, A_mat, &n_global, piv, b_vec, &n_global, &info); hypre_TFree(piv, HYPRE_MEMORY_HOST); 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION else { hypre_CSRMatrixDestroy(A_CSR); A_CSR = NULL; hypre_SeqVectorDestroy(f_vector); f_vector = NULL; } #endif } break; } return (relax_error); } hypre-2.18.2/src/parcsr_ls/par_relax_interface.c000066400000000000000000000060261355566575400217040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_type, 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_type < 3) { if (cycle_type < 2) { relax_points[0] = 1; relax_points[1] = -1; } else { 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-2.18.2/src/parcsr_ls/par_relax_more.c000066400000000000000000001011421355566575400207010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" HYPRE_Int hypre_LINPACKcgtql1(HYPRE_Int*,HYPRE_Real *,HYPRE_Real *,HYPRE_Int *); /****************************************************************************** * *use max norm to estimate largest eigenvalue * *****************************************************************************/ HYPRE_Int hypre_ParCSRMaxEigEstimate(hypre_ParCSRMatrix *A, /* matrix to relax with */ HYPRE_Int scale, /* scale by diagonal?*/ HYPRE_Real *max_eig) { HYPRE_Real e_max; HYPRE_Real row_sum, max_norm; HYPRE_Real *A_diag_data; HYPRE_Real *A_offd_data; HYPRE_Real temp; HYPRE_Real diag_value; HYPRE_Int pos_diag, neg_diag; HYPRE_Int A_num_rows; HYPRE_Int *A_diag_i; HYPRE_Int *A_offd_i; HYPRE_Int j; HYPRE_Int i, start; /* estimate with the inf-norm of A - should be ok for SPD matrices */ A_num_rows = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(A)); A_diag_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A)); A_diag_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A)); A_offd_i = hypre_CSRMatrixI(hypre_ParCSRMatrixOffd(A)); A_offd_data = hypre_CSRMatrixData(hypre_ParCSRMatrixOffd(A)); max_norm = 0.0; pos_diag = neg_diag = 0; for ( i = 0; i < A_num_rows; i++ ) { start = A_diag_i[i]; diag_value = A_diag_data[start]; if (diag_value > 0) { pos_diag++; } if (diag_value < 0) { neg_diag++; diag_value = -diag_value; } row_sum = diag_value; /*for (j = 0; j < row_length; j++)*/ for (j = start+1; j < A_diag_i[i+1]; j++) { row_sum += fabs(A_diag_data[j]); } for (j = A_offd_i[i]; j < A_offd_i[i+1]; j++) { row_sum += fabs(A_offd_data[j]); } if (scale) { if (diag_value != 0.0) row_sum = row_sum/diag_value; } if ( row_sum > max_norm ) max_norm = row_sum; } /* get max across procs */ hypre_MPI_Allreduce(&max_norm, &temp, 1, HYPRE_MPI_REAL, hypre_MPI_MAX, hypre_ParCSRMatrixComm(A)); max_norm = temp; /* from Charles */ if ( pos_diag == 0 && neg_diag > 0 ) max_norm = - max_norm; /* eig estimates */ e_max = max_norm; /* return */ *max_eig = e_max; return hypre_error_flag; } /****************************************************************************** use CG to get the eigenvalue estimate scale means get eig est of (D^{-1/2} A D^{-1/2} ******************************************************************************/ 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_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 diag; HYPRE_Real lambda_min; HYPRE_Real *s_data, *p_data, *ds_data, *u_data; HYPRE_Int local_size = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(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); /* 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); hypre_ParVectorSetPartitioningOwner(r,0); p = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(p); hypre_ParVectorSetPartitioningOwner(p,0); s = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(s); hypre_ParVectorSetPartitioningOwner(s,0); ds = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(ds); hypre_ParVectorSetPartitioningOwner(ds,0); u = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(u); hypre_ParVectorSetPartitioningOwner(u,0); /* 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) { for (i = 0; i < local_size; i++) { diag = A_diag_data[A_diag_i[i]]; ds_data[i] = 1/sqrt(diag); } } 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 (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] *= 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_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_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_Real theta, delta; HYPRE_Real den; HYPRE_Real upper_bound, lower_bound; HYPRE_Int i, j; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag); HYPRE_Real coefs[5]; HYPRE_Real mult; HYPRE_Real *orig_u; HYPRE_Real tmp_d; HYPRE_Int cheby_order; HYPRE_Real *ds_data, *tmp_data; HYPRE_Real diag; hypre_ParVector *ds; hypre_ParVector *tmp_vec; /* 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; /* 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 - pow(delta,3) + 2*pow(theta,3); coefs[0] = (4*delta*theta - pow(delta,2) + 6*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*pow(theta,3) - 3*pow(delta,2)*pow(theta,2) - 3*pow(delta,3)*theta + 4*pow(theta,4) ); coefs[0] = (6*pow(delta,2)*theta - 12*delta*pow(theta,2) + 3*pow(delta,3) - 16*pow(theta,3) )/den; coefs[1] = (12*delta*theta - 3*pow(delta,2) + 24*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 = pow(delta,4) - 8*delta*delta*theta*theta + 8*pow(theta,4); coefs[0] = (32*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; } } orig_u = hypre_CTAlloc(HYPRE_Real, num_rows, HYPRE_MEMORY_HOST); if (!scale) { /* get residual: r = f - A*u */ hypre_ParVectorCopy(f, r); hypre_ParCSRMatrixMatvec(-1.0, A, u, 1.0, r); 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]; #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]; } } #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/sqrt(diagonal) */ ds = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(ds); hypre_ParVectorSetPartitioningOwner(ds,0); ds_data = hypre_VectorData(hypre_ParVectorLocalVector(ds)); tmp_vec = hypre_ParVectorCreate(hypre_ParCSRMatrixComm(A), hypre_ParCSRMatrixGlobalNumRows(A), hypre_ParCSRMatrixRowStarts(A)); hypre_ParVectorInitialize(tmp_vec); hypre_ParVectorSetPartitioningOwner(tmp_vec,0); 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 */ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j,diag) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_rows; j++) { diag = A_diag_data[A_diag_i[j]]; ds_data[j] = 1/sqrt(diag); r_data[j] = ds_data[j] * f_data[j]; } hypre_ParCSRMatrixMatvec(-1.0, A, u, 0.0, tmp_vec); #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] * tmp_data[j]; } /* save original u, then start the iteration by multiplying r by the cheby 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 */ #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]; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(j,tmp_d) HYPRE_SMP_SCHEDULE #endif for ( j = 0; j < num_rows; j++ ) { tmp_d = ds_data[j]* v_data[j]; u_data[j] = mult * r_data[j] + tmp_d; } } /* end of cheby_order loop */ /* now we have to scale u_data before adding it to u_orig*/ #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]; } hypre_ParVectorDestroy(ds); hypre_ParVectorDestroy(tmp_vec); }/* end of scaling code */ hypre_TFree(orig_u, HYPRE_MEMORY_HOST); return hypre_error_flag; } /*-------------------------------------------------------------------------- * 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; } /*-------------------------------------------------------------------------- * 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_Real hypre_LINPACKcgpthy(HYPRE_Real*,HYPRE_Real*); 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],fabs(d__1)) + (d__2 = e[l],fabs(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],fabs(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],fabs(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 = fabs(*a),d__2 = fabs(*b); p = hypre_max(d__1,d__2); if (!p) { goto L20; } /* Computing MIN */ d__2 = fabs(*a),d__3 = fabs(*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_ParCSRRelax_L1_Jacobi (same as the one in AMS, but this allows CF) u += 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 ) { 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; 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; HYPRE_Int i, j; HYPRE_Int ii, jj; HYPRE_Int num_sends; HYPRE_Int index, start; HYPRE_Int num_procs, my_id ; HYPRE_Real zero = 0.0; HYPRE_Real res; 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); 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. *-----------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < n; i++) { Vtemp_data[i] = u_data[i]; } if (num_procs > 1) { hypre_ParCSRCommHandleDestroy(comm_handle); comm_handle = NULL; } /*----------------------------------------------------------------- * Relax all points. *-----------------------------------------------------------------*/ if (relax_points == 0) { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += (relax_weight*res)/l1_norms[i]; } } } /*----------------------------------------------------------------- * Relax only C or F points as determined by relax_points. *-----------------------------------------------------------------*/ else { #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,ii,jj,res) HYPRE_SMP_SCHEDULE #endif 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 && A_diag_data[A_diag_i[i]] != zero) { res = f_data[i]; for (jj = A_diag_i[i]; 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] * Vext_data[ii]; } u_data[i] += (relax_weight * res)/l1_norms[i]; } } } if (num_procs > 1) { hypre_TFree(Vext_data, HYPRE_MEMORY_HOST); hypre_TFree(v_buf_data, HYPRE_MEMORY_HOST); } return 0; } hypre-2.18.2/src/parcsr_ls/par_restr.c000066400000000000000000001022511355566575400177050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, hypre_ParCSRMatrix **R_ptr, HYPRE_Int is_triangular, HYPRE_Int gmres_switch) { 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION /*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); #else /*my_first_cpt = num_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; #endif /*------------------------------------------------------------------- * 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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 = col_offd_S_to_A ? col_offd_S_to_A[S_offd_j[j]] : 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; /* R does not own ColStarts, since A does */ hypre_ParCSRMatrixOwnsColStarts(R) = 0; 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; memcpy(v, b, n*sizeof(HYPRE_Complex)); normr0 = 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 = sqrt(hypre_ddot(&n, w, &one, w, &one)); if (fabs(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 = sqrt(hii*hii + hii1*hii1); if (fabs(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 = fabs(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[n]; hypre_dense_topo_sort(L, ordering, n, 0); // Ordered Gauss-Seidel iteration HYPRE_Int i, col; for (i=0; i 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); } 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_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.18.2/src/parcsr_ls/par_scaled_matnorm.c000066400000000000000000000104351355566575400215400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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)); hypre_ParVectorSetPartitioningOwner(dinvsqrt,0); 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/sqrt(fabs(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] += fabs(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] += fabs(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.18.2/src/parcsr_ls/par_schwarz.c000066400000000000000000000276561355566575400202460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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() { 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_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_ParVectorSetPartitioningOwner(Vtemp,0); 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.18.2/src/parcsr_ls/par_stats.c000066400000000000000000001433011355566575400177050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /***************************************************************************** * * 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 ) { 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; HYPRE_Real *A_diag_data; HYPRE_Int *A_diag_i; hypre_CSRBlockMatrix *A_block_diag; hypre_CSRMatrix *A_offd; HYPRE_Real *A_offd_data; HYPRE_Int *A_offd_i; hypre_CSRBlockMatrix *A_block_offd; hypre_CSRMatrix *P_diag; HYPRE_Real *P_diag_data; HYPRE_Int *P_diag_i; hypre_CSRBlockMatrix *P_block_diag; hypre_CSRMatrix *P_offd; 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 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, bnnz; 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); 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); #ifdef HYPRE_NO_GLOBAL_PARTITION gather_buff = hypre_CTAlloc(HYPRE_Real, 6, HYPRE_MEMORY_HOST); #else gather_buff = hypre_CTAlloc(HYPRE_Real, 6*num_procs, HYPRE_MEMORY_HOST); #endif 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")); #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_printf( "\n No global partition option chosen.\n\n"); #endif 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 == 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-%.1f)\n", restri_type-3); } 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]); A_diag_data = hypre_CSRMatrixData(A_diag); A_diag_i = hypre_CSRMatrixI(A_diag); A_offd = hypre_ParCSRMatrixOffd(A_array[level]); A_offd_data = hypre_CSRMatrixData(A_offd); A_offd_i = hypre_CSRMatrixI(A_offd); 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); } #ifdef HYPRE_NO_GLOBAL_PARTITION 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); } #else 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_Gather(send_buff,4,HYPRE_MPI_REAL,gather_buff,4,HYPRE_MPI_REAL,0,comm); if (my_id == 0) { global_min_e = 1000000; global_max_e = 0; global_min_rsum = 1.0e7; global_max_rsum = 0.0; for (j = 0; j < num_procs; j++) { numrows = row_starts[j+1]-row_starts[j]; if (numrows) { global_min_e = hypre_min(global_min_e, (HYPRE_Int) gather_buff[j*4]); global_min_rsum = hypre_min(global_min_rsum, gather_buff[j*4 +2]); } global_max_e = hypre_max(global_max_e, (HYPRE_Int) gather_buff[j*4 +1]); global_max_rsum = hypre_max(global_max_rsum, gather_buff[j*4 +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); } #endif } 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]); P_diag_data = hypre_CSRMatrixData(P_diag); P_diag_i = hypre_CSRMatrixI(P_diag); P_offd = hypre_ParCSRMatrixOffd(P_array[level]); P_offd_data = hypre_CSRMatrixData(P_offd); P_offd_i = hypre_CSRMatrixI(P_offd); 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)); } #ifdef HYPRE_NO_GLOBAL_PARTITION 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); } #else 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_Gather(send_buff,6,HYPRE_MPI_REAL,gather_buff,6,HYPRE_MPI_REAL,0,comm); if (my_id == 0) { global_min_e = 1000000; global_max_e = 0; global_min_rsum = 1.0e7; global_max_rsum = 0.0; global_min_wt = 1.0e7; global_max_wt = 0.0; for (j = 0; j < num_procs; j++) { numrows = row_starts[j+1] - row_starts[j]; if (numrows) { global_min_e = hypre_min(global_min_e, (HYPRE_Int) gather_buff[j*6]); global_min_rsum = hypre_min(global_min_rsum, gather_buff[j*6+2]); global_min_wt = hypre_min(global_min_wt, gather_buff[j*6+4]); } global_max_e = hypre_max(global_max_e, (HYPRE_Int) gather_buff[j*6+1]); global_max_rsum = hypre_max(global_max_rsum, gather_buff[j*6+3]); global_max_wt = hypre_max(global_max_wt, gather_buff[j*6+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); } #endif } total_variables = 0; operat_cmplxty = 0; for (j=0;j -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\n"); } else if (additive > 0 || mult_additive > 0 || simple > 0) { HYPRE_Int add_lvl = add_end; if (add_end == -1) add_lvl = num_levels-1; 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\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\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\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); 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); return(0); } /*--------------------------------------------------------------- * 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 0; } hypre-2.18.2/src/parcsr_ls/par_strength.c000066400000000000000000002772501355566575400204200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_hopscotch_hash.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; /*-------------------------------------------------------------- * 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); /* row_starts is owned by A, col_starts = row_starts */ hypre_ParCSRMatrixSetRowStartsOwner(S,0); 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_TAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_HOST); 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, 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); } /*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 ((fabs(row_sum) > fabs(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) = HYPRE_MEMORY_HOST; hypre_CSRMatrixMemoryLocation(S_offd) = HYPRE_MEMORY_HOST; 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) { #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); #endif HYPRE_Int exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(A)) ); hypre_assert(exec != HYPRE_EXEC_UNSET); HYPRE_Int ierr = 0; if (exec == HYPRE_EXEC_HOST) { /* printf(" createS Host \n");*/ ierr = hypre_BoomerAMGCreateSHost(A,strength_threshold,max_row_sum,num_functions,dof_func,S_ptr); } #if defined(HYPRE_USING_CUDA) else { /* printf(" createS Device \n");*/ ierr = hypre_BoomerAMGCreateSDevice(A,strength_threshold,max_row_sum,num_functions,dof_func,S_ptr); } #endif #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif 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. Currently assumes num_functions == 1, hence separate routine is used for now. 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 SMRK, 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_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, jj, jA, jS; HYPRE_Int ierr = 0; HYPRE_Int *prefix_sum_workspace; /*-------------------------------------------------------------- * 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); /* row_starts is owned by A, col_starts = row_starts */ hypre_ParCSRMatrixSetRowStartsOwner(S,0); 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); /* #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros_diag; i++) S_diag_j[i] = 0; */ 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; S_offd_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_HOST); /* #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < num_nonzeros_offd; i++) S_offd_j[i] = 0; */ 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); } /*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 (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[jj] == SMRK) { 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++) { 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[jj] == SMRK) { row_scale = hypre_min(row_scale, A_offd_data[jA]); row_sum += A_offd_data[jA]; } } } /* diag >= 0*/ 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 ((fabs(row_sum) > fabs(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++) { jj = A_diag_j[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 (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; --jS_diag; } else { S_temp_diag_j[jA] = jj; } } 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[jj] == SMRK) { if (A_offd_data[jA] <= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = jj; } } 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; --jS_diag; } else { S_temp_diag_j[jA] = jj; } } 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[jj] == SMRK) { if (A_offd_data[jA] >= strength_threshold * row_scale) { S_temp_offd_j[jA] = -1; --jS_offd; } else { S_temp_offd_j[jA] = jj; } } else { S_temp_offd_j[jA] = -1; } } } /* diag >= 0 */ } /* !((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; } jS_diag += A_diag_i[i + 1] - A_diag_i[i] - 1; jS_offd += A_offd_i[i + 1] - A_offd_i[i]; 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]; } /* 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; *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); #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_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) { 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; /*-------------------------------------------------------------- * 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); /* row_starts is owned by A, col_starts = row_starts */ hypre_ParCSRMatrixSetRowStartsOwner(S,0); 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); S_diag_j = hypre_CSRMatrixJ(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); 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 = fabs(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, fabs(A_diag_data[jA])); row_sum += fabs(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, fabs(A_offd_data[jA])); row_sum += fabs(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, fabs(A_diag_data[jA])); row_sum += fabs(A_diag_data[jA]); } for (jA = A_offd_i[i]; jA < A_offd_i[i+1]; jA++) { row_scale = hypre_max(row_scale, fabs(A_offd_data[jA])); row_sum += fabs(A_offd_data[jA]); } } /* compute row entries of S */ S_diag_j[A_diag_i[i]] = -1; /* reject diag entry */ if ( fabs(row_sum) < fabs(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 (fabs(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 (fabs(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 (fabs(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 (fabs(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_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; 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; } } comm_pkg_S = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_S) = comm; hypre_ParCSRCommPkgNumRecvs(comm_pkg_S) = num_recvs_S; hypre_ParCSRCommPkgRecvProcs(comm_pkg_S) = recv_procs_S; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_S) = recv_vec_starts_S; hypre_ParCSRCommPkgNumSends(comm_pkg_S) = num_sends_S; hypre_ParCSRCommPkgSendProcs(comm_pkg_S) = send_procs_S; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_S) = send_map_starts_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_ParCSRCommPkgSendMapElmts(comm_pkg_S) = send_map_elmts_S; 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_BoomerAMGCreate2ndS( 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; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = coarse_row_starts[my_id]; my_last_cpt = coarse_row_starts[my_id+1]-1; global_num_coarse = coarse_row_starts[num_procs]; #endif 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; } tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(tmp_comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgSendProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgRecvProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = tmp_send_map_starts; 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); tmp_recv_vec_starts[0] = 0; for (i=0; i < num_recvs; i++) tmp_recv_vec_starts[i+1] = S_ext_i[recv_vec_starts[i+1]]; hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = tmp_recv_vec_starts; 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]); hypre_ParCSRMatrixOwnsRowStarts(S2) = 0; 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_BoomerAMGCorrectCFMarker : corrects CF_marker after aggr. coarsening *--------------------------------------------------------------------------*/ HYPRE_Int hypre_BoomerAMGCorrectCFMarker(HYPRE_Int *CF_marker, HYPRE_Int num_var, HYPRE_Int *new_CF_marker) { HYPRE_Int i, cnt; cnt = 0; for (i=0; i < num_var; i++) { if (CF_marker[i] > 0 ) { if (CF_marker[i] == 1) CF_marker[i] = new_CF_marker[cnt++]; else { 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_BoomerAMGCorrectCFMarker2(HYPRE_Int *CF_marker, HYPRE_Int num_var, HYPRE_Int *new_CF_marker) { HYPRE_Int i, cnt; cnt = 0; for (i=0; i < num_var; i++) { if (CF_marker[i] > 0 ) { if (new_CF_marker[cnt] == -1) CF_marker[i] = -2; else CF_marker[i] = 1; cnt++; } } return 0; } hypre-2.18.2/src/parcsr_ls/par_strength_device.c000066400000000000000000000355271355566575400217360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #if defined(HYPRE_USING_CUDA) __global__ void hypre_BoomerAMGCreateS_rowcount( 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_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_Int *row_starts = hypre_ParCSRMatrixRowStarts(A); HYPRE_Int num_variables = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int 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 i; HYPRE_Int ierr = 0; HYPRE_Int *dof_func_offd_dev = NULL; HYPRE_Int *dof_func_dev = NULL; HYPRE_Int num_sends; 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 = 1, else S_ij = 0. * * 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_CTAlloc(HYPRE_Int, num_variables+1, HYPRE_MEMORY_SHARED); S_offd_i = hypre_CTAlloc(HYPRE_Int, num_variables+1, HYPRE_MEMORY_SHARED); S_temp_diag_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_diag, HYPRE_MEMORY_DEVICE); S_temp_offd_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros_offd, HYPRE_MEMORY_DEVICE); if (num_functions > 1) { dof_func_offd_dev = hypre_CTAlloc(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_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_v2(11, comm_pkg, HYPRE_MEMORY_HOST, int_buf_data, HYPRE_MEMORY_DEVICE, dof_func_offd_dev); hypre_ParCSRCommHandleDestroy(comm_handle); hypre_TFree(int_buf_data, HYPRE_MEMORY_HOST); dof_func_dev = hypre_CTAlloc(HYPRE_Int, num_variables, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(dof_func_dev, dof_func, HYPRE_Int, num_variables, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); } /* count the row nnz of S */ dim3 bDim = hypre_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(num_variables, "warp", bDim); HYPRE_CUDA_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_dev, dof_func_offd_dev, S_diag_i, S_offd_i ); 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, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(&S_num_nonzeros_offd, &S_offd_i[num_variables], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); S_diag_j = hypre_TAlloc(HYPRE_Int, S_num_nonzeros_diag, HYPRE_MEMORY_SHARED); S_offd_j = hypre_TAlloc(HYPRE_Int, S_num_nonzeros_offd, HYPRE_MEMORY_SHARED); /* remove those -1's */ tmp = HYPRE_THRUST_CALL(copy_if, S_temp_diag_j, S_temp_diag_j + num_nonzeros_diag, S_diag_j, is_nonnegative()); hypre_assert(S_num_nonzeros_diag == tmp - S_diag_j); tmp = HYPRE_THRUST_CALL(copy_if, S_temp_offd_j, S_temp_offd_j + num_nonzeros_offd, S_offd_j, is_nonnegative()); 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); /* row_starts is owned by A, col_starts = row_starts */ hypre_ParCSRMatrixSetRowStartsOwner(S,0); 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_ParCSRMatrixCommPkg(S) = NULL; hypre_ParCSRMatrixColMapOffd(S) = hypre_TAlloc(HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(S), hypre_ParCSRMatrixColMapOffd(A), HYPRE_Int, num_cols_offd, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); *S_ptr = S; hypre_TFree(dof_func_offd_dev, HYPRE_MEMORY_DEVICE); hypre_TFree(dof_func_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_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 -1 should be removed S_temp_offd_j - S_offd_j vector before compression, i.e.,elements that are -1 should be removed jS_diag - S_diag_i vector for compressed S_diag jS_offd - S_offd_i 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_cuda_get_grid_warp_id<1,1>(); if (row >= nr_of_rows) { return; } HYPRE_Int lane = hypre_cuda_get_lane_id<1>(); HYPRE_Int p_diag, q_diag, p_offd, q_offd; /* diag part */ if (lane < 2) { p_diag = read_only_load(A_diag_i + row + lane); } q_diag = __shfl_sync(HYPRE_WARP_FULL_MASK, p_diag, 1); p_diag = __shfl_sync(HYPRE_WARP_FULL_MASK, p_diag, 0); for (HYPRE_Int i = p_diag + lane; __any_sync(HYPRE_WARP_FULL_MASK, i < q_diag); i += HYPRE_WARP_SIZE) { if (i < q_diag) { 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 = __shfl_sync(HYPRE_WARP_FULL_MASK, p_offd, 1); p_offd = __shfl_sync(HYPRE_WARP_FULL_MASK, p_offd, 0); for (HYPRE_Int i = p_offd + lane; __any_sync(HYPRE_WARP_FULL_MASK, i < q_offd); i += HYPRE_WARP_SIZE) { if (i < q_offd) { 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(diag); /* sign of diag */ const HYPRE_Int sdiag = diag > 0.0 ? 1 : -1; /* compute scaling factor and row sum */ row_sum = warp_allreduce_sum(row_sum); if (diag > 0.0) { row_scale = warp_allreduce_min(row_min); } else { row_scale = warp_allreduce_max(row_max); } /* compute row of S */ HYPRE_Int all_weak = max_row_sum < 1.0 && fabs(row_sum) > fabs(diag) * max_row_sum; const HYPRE_Real thresh = sdiag * strength_threshold * row_scale; for (HYPRE_Int i = p_diag + lane; __any_sync(HYPRE_WARP_FULL_MASK, i < q_diag); i += HYPRE_WARP_SIZE) { if (i < q_diag) { 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; } } for (HYPRE_Int i = p_offd + lane; __any_sync(HYPRE_WARP_FULL_MASK, i < q_offd); i += HYPRE_WARP_SIZE) { if (i < q_offd) { 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(row_nnz_diag); row_nnz_offd = warp_reduce_sum(row_nnz_offd); if (0 == lane) { jS_diag[row] = row_nnz_diag; jS_offd[row] = row_nnz_offd; } } #endif /* #if defined(HYPRE_USING_CUDA) */ hypre-2.18.2/src/parcsr_ls/par_sv_interp.c000066400000000000000000002413141355566575400205630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_ParVectorSetPartitioningOwner(new_vector, 0); 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_Int **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; HYPRE_Int num_functions = *nf; HYPRE_Int *c_dof_func = *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, 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; /* 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, HYPRE_MEMORY_SHARED); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_diag, HYPRE_MEMORY_SHARED); P_diag_i_new = hypre_CTAlloc(HYPRE_Int, nv + 1, HYPRE_MEMORY_SHARED); P_offd_j_big = hypre_CTAlloc(HYPRE_BigInt, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_i_new = hypre_CTAlloc(HYPRE_Int, nv + 1, HYPRE_MEMORY_SHARED); 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) { 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 && fabs(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 Tzanios'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 (fabs(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 Tzanios'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 (fabs(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 = fabs(P_diag_data_new[j]); else value = fabs(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 = fabs(P_offd_data_new[j]); else value = fabs(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 = fabs(P_diag_data_new[j]); else value = fabs(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 = fabs(P_offd_data_new[j]); else value = fabs(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(c_dof_func, HYPRE_Int, new_ncv, HYPRE_MEMORY_HOST); 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; *coarse_dof_func = c_dof_func; /* also we need to update the col starts and global num columns*/ /* assumes that unknowns are together on a procsessor with * nodal coarsening */ #ifdef HYPRE_NO_GLOBAL_PARTITION new_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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 new_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i < (num_procs+1); i++) { new_col_starts[i] = (col_starts[i]/(HYPRE_BigInt)num_functions)*(HYPRE_BigInt)new_nf ; } g_nc = new_col_starts[num_procs]; #endif } else /* not first level */ { /* grab global num cols */ g_nc = hypre_ParCSRMatrixGlobalNumCols(*P); /* copy col starts */ #ifdef HYPRE_NO_GLOBAL_PARTITION new_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); new_col_starts[0] = col_starts[0]; new_col_starts[1] = col_starts[1]; #else new_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i< (num_procs+1); i++) { new_col_starts[i] = col_starts[i]; } #endif } /* 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; hypre_ParCSRMatrixOwnsRowStarts(new_P) = 0; hypre_ParCSRMatrixOwnsColStarts(new_P) = 1; /* 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_SHARED); 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_Int i,j, k, pp; //printf(" hypre_BoomerAMGRefineInterp \n"); 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_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; HYPRE_Real *P_ext_data; HYPRE_Int *P_ext_i; HYPRE_BigInt *P_ext_j; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION my_first_cpt = num_cpts_global[0]; #else my_first_cpt = num_cpts_global[myid]; #endif /* 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, HYPRE_MEMORY_SHARED); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, P_offd_size, HYPRE_MEMORY_SHARED); 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 (fabs(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 (fabs(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 (fabs(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, HYPRE_MEMORY_SHARED); hypre_TFree(P_offd_data, HYPRE_MEMORY_SHARED); 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); if (num_procs > 1) hypre_CSRMatrixDestroy(P_ext); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_sv_interp_ln.c000066400000000000000000003043271355566575400212600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int **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, gm_row_sum; 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 = *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; 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; HYPRE_Real *P_ext_data; HYPRE_Int *P_ext_i; HYPRE_BigInt *P_ext_j; 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_Int g_nc; #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; #ifdef HYPRE_NO_GLOBAL_PARTITION my_first_cpt = num_cpts_global[0]; #else my_first_cpt = num_cpts_global[myid]; #endif /* 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, HYPRE_MEMORY_SHARED); P_diag_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_diag, HYPRE_MEMORY_SHARED); P_diag_i_new = hypre_CTAlloc(HYPRE_Int, num_rows_P + 1, HYPRE_MEMORY_SHARED); P_offd_j_big = hypre_CTAlloc(HYPRE_BigInt, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_j_new = hypre_CTAlloc(HYPRE_Int, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_data_new = hypre_CTAlloc(HYPRE_Real, new_nnz_offd, HYPRE_MEMORY_SHARED); P_offd_i_new = hypre_CTAlloc(HYPRE_Int, num_rows_P + 1, HYPRE_MEMORY_SHARED); 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) 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) && (fabs(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 (fabs(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 (fabs(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 (fabs(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) fmod(new_col, num_functions + num_smooth_vecs); else fcn_num = (HYPRE_Int) 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) fmod((HYPRE_Real)big_new_col, num_functions + num_smooth_vecs); else fcn_num = (HYPRE_Int) 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) 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) 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) 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) big_new_col - 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; HYPRE_Int q_count_k, num_lost, p_count_tot; HYPRE_Int lost_counter_diag, lost_counter_offd, j_counter; HYPRE_Int new_num_q, new_j_counter, new_diag_pos, new_offd_pos; 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 = fabs(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 = fabs(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 = fabs(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 = fabs(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(c_dof_func, HYPRE_Int, new_ncv, HYPRE_MEMORY_HOST); 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; *coarse_dof_func = c_dof_func; /* also we need to update the col starts and global num columns*/ /* assumes that unknowns are together on a procsessor with * nodal coarsening */ #ifdef HYPRE_NO_GLOBAL_PARTITION new_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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 new_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i < (num_procs+1); i++) { new_col_starts[i] = (col_starts[i]/(HYPRE_BigInt)num_functions)*(HYPRE_BigInt)new_nf ; } g_nc = new_col_starts[num_procs]; #endif } else /* not first level */ { /* grab global num cols */ g_nc = hypre_ParCSRMatrixGlobalNumCols(*P); /* copy col starts */ #ifdef HYPRE_NO_GLOBAL_PARTITION new_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); new_col_starts[0] = col_starts[0]; new_col_starts[1] = col_starts[1]; #else new_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i< (num_procs+1); i++) { new_col_starts[i] = col_starts[i]; } #endif } /* 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; hypre_ParCSRMatrixOwnsRowStarts(new_P) = 0; hypre_ParCSRMatrixOwnsColStarts(new_P) = 0; /* we allocate new_col_starts*/ /* 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_SHARED); hypre_TFree(smooth_vec_offd, HYPRE_MEMORY_HOST); hypre_TFree(smooth_vec_offd_P, HYPRE_MEMORY_HOST); if (num_procs > 1) hypre_CSRMatrixDestroy(P_ext); return hypre_error_flag; } hypre-2.18.2/src/parcsr_ls/par_sv_interp_lsfit.c000066400000000000000000000445641355566575400217740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/parcsr_ls/par_vardifconv.c000066400000000000000000000361751355566575400207220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Real *offd_data; HYPRE_BigInt *global_part; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt,2,HYPRE_MEMORY_HOST); 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; #else HYPRE_Int nx_size, ny_size, nz_size; HYPRE_Int jx, jy, jz; global_part = hypre_CTAlloc(HYPRE_BigInt, P*Q*R+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jz = 0; jz < R; jz++) { nz_size = (HYPRE_Int)(nz_part[jz+1]-nz_part[jz]); for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size*nz_size); } } } #endif diag_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); offd_i = hypre_CTAlloc(HYPRE_Int, local_num_rows+1, HYPRE_MEMORY_SHARED); rhs_data = hypre_CTAlloc(HYPRE_Real, local_num_rows, HYPRE_MEMORY_SHARED); 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_SHARED); diag_data = hypre_CTAlloc(HYPRE_Real, diag_i[local_num_rows], HYPRE_MEMORY_SHARED); 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_SHARED); offd_data = hypre_CTAlloc(HYPRE_Real, offd_i[local_num_rows], HYPRE_MEMORY_SHARED); } 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); hypre_ParVectorOwnsPartitioning(par_rhs) = 0; 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(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; /* value = 1.0 + 1000.0*fabs(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 * atan(1.0); value = cos(pi*xx)*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*fabs(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 * atan(1.0); value = 1.0 - 2.0*xx; value = cos(pi*xx)*cos(pi*yy); */ /* HYPRE_Real value; value = 1.0 + 1000.0 * fabs(xx-yy); HYPRE_Real value, x0, y0; x0 = fabs(xx - 0.5); y0 = fabs(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_Real value; /*HYPRE_Real pi; pi = 4.0 * atan(1.0); value = -sin(pi*xx)*cos(pi*yy);*/ value = 0; return value; } HYPRE_Real efun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; /*HYPRE_Real pi; pi = 4.0 * atan(1.0); value = sin(pi*yy)*cos(pi*xx);*/ value = 0; return value; } HYPRE_Real ffun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 0.0; return value; } HYPRE_Real gfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 0.0; return value; } HYPRE_Real rfun(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { /* HYPRE_Real value, pi; pi = 4.0 * atan(1.0); value = -4.0*pi*pi*sin(pi*xx)*sin(pi*yy)*cos(pi*xx)*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_Real value; /*HYPRE_Real pi; pi = 4.0 * atan(1.0); value = sin(pi*xx)+sin(13*pi*xx)+sin(pi*yy)+sin(13*pi*yy);*/ value = 0.0; return value; } hypre-2.18.2/src/parcsr_ls/par_vardifconv_rs.c000066400000000000000000000365361355566575400214270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; HYPRE_Int *offd_j; HYPRE_BigInt *big_offd_j; HYPRE_Real *offd_data; HYPRE_BigInt *global_part; 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; #ifdef HYPRE_NO_GLOBAL_PARTITION global_part = hypre_CTAlloc(HYPRE_BigInt,2,HYPRE_MEMORY_HOST); 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; #else HYPRE_Int nx_size, ny_size, nz_size; HYPRE_Int jx, jy, jz; global_part = hypre_CTAlloc(HYPRE_BigInt, P*Q*R+1, HYPRE_MEMORY_HOST); global_part[0] = 0; cnt = 1; for (jz = 0; jz < R; jz++) { nz_size = (HYPRE_Int)(nz_part[jz+1]-nz_part[jz]); for (jy = 0; jy < Q; jy++) { ny_size = (HYPRE_Int)(ny_part[jy+1]-ny_part[jy]); for (jx = 0; jx < P; jx++) { nx_size = (HYPRE_Int)(nx_part[jx+1] - nx_part[jx]); global_part[cnt] = global_part[cnt-1]; global_part[cnt++] += (HYPRE_BigInt)(nx_size*ny_size*nz_size); } } } #endif 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); hypre_ParVectorOwnsPartitioning(par_rhs) = 0; 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_Real value; value = 1.0; return value; } HYPRE_Real bfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 1.0; return value; } HYPRE_Real cfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 1.0; return value; } HYPRE_Real dfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; if (rs_example == 1) { value = 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_Real value; if (rs_example == 1) { value = 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_Real value; value = 0.0; return value; } HYPRE_Real rfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 1.0; return value; } HYPRE_Real bndfun_rs(HYPRE_Real xx, HYPRE_Real yy, HYPRE_Real zz) { HYPRE_Real value; value = 0.0; return value; } hypre-2.18.2/src/parcsr_ls/partial.c000066400000000000000000002735241355566575400173540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int *col_offd_S_to_A, 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; 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(); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; /*my_first_old_cpt = num_old_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; total_old_global_cpts = num_old_cpts_global[num_procs]; n_coarse_old = (HYPRE_Int)(num_old_cpts_global[my_id+1] - num_old_cpts_global[my_id]); /*n_coarse = num_cpts_global[my_id+1] - num_cpts_global[my_id];*/ #endif 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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_ParCSRMatrixOwnsRowStarts(P) = 0; 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_Int *col_offd_S_to_A, 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; /* 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 alfa, 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; HYPRE_Real wall_1 = 0; HYPRE_Real wall_2 = 0; HYPRE_Real wall_3 = 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; /*my_first_old_cpt = num_old_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; total_old_global_cpts = num_old_cpts_global[num_procs]; n_coarse_old = (HYPRE_Int)(num_old_cpts_global[my_id+1] - num_old_cpts_global[my_id]); /*n_coarse = num_cpts_global[my_id+1] - num_cpts_global[my_id];*/ #endif 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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) alfa = sum_neg/sum_neg_C/diagonal; if (sum_pos_C*diagonal) 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) 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, 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_ParCSRMatrixOwnsRowStarts(P) = 0; 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_Int *col_offd_S_to_A, 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; HYPRE_Real *A_ext_data; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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; HYPRE_Int *Sop_i; HYPRE_BigInt *Sop_j; 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; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else my_first_cpt = num_cpts_global[my_id]; /*my_first_old_cpt = num_old_cpts_global[my_id];*/ total_global_cpts = num_cpts_global[num_procs]; total_old_global_cpts = num_old_cpts_global[num_procs]; n_coarse_old = (HYPRE_Int)(num_old_cpts_global[my_id+1] - num_old_cpts_global[my_id]); /*n_coarse = num_cpts_global[my_id+1] - num_cpts_global[my_id];*/ #endif 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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++) { if(col_offd_S_to_A) k1 = col_offd_S_to_A[S_offd_j[kk]]; else 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(col_offd_S_to_A) i1 = col_offd_S_to_A[i1]; 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 && (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_ParCSRMatrixOwnsRowStarts(P) = 0; 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.18.2/src/parcsr_ls/pcg_par.c000066400000000000000000000237041355566575400173240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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( HYPRE_Int count, HYPRE_Int elt_size ) { return( (void*) hypre_CTAlloc( char, count * elt_size , HYPRE_MEMORY_HOST) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovFree *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovFree( void *ptr ) { HYPRE_Int ierr = 0; hypre_Free( 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_ParVectorCreate( hypre_ParVectorComm(vector), hypre_ParVectorGlobalSize(vector), hypre_ParVectorPartitioning(vector) ); hypre_ParVectorSetPartitioningOwner(new_vector,0); hypre_ParVectorInitialize(new_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; HYPRE_Complex *array_data; size = hypre_VectorSize(hypre_ParVectorLocalVector(vector)); array_data = hypre_CTAlloc(HYPRE_Complex, (n*size), HYPRE_MEMORY_SHARED); new_vector = hypre_CTAlloc(hypre_ParVector*, n, HYPRE_MEMORY_HOST); for (i=0; i < n; i++) { new_vector[i] = hypre_ParVectorCreate( hypre_ParVectorComm(vector), hypre_ParVectorGlobalSize(vector), hypre_ParVectorPartitioning(vector) ); hypre_ParVectorSetPartitioningOwner(new_vector[i],0); hypre_VectorData(hypre_ParVectorLocalVector(new_vector[i])) = &array_data[i*size]; hypre_ParVectorInitialize(new_vector[i]); 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 ) { 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 ) { 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 ) { return ( hypre_ParCSRMatrixMatvecT( alpha, (hypre_ParCSRMatrix *) A, (hypre_ParVector *) x, beta, (hypre_ParVector *) y ) ); } /*-------------------------------------------------------------------------- * hypre_ParKrylovMatvecDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovMatvecDestroy( void *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_ParVectorSetConstantValues( (hypre_ParVector *) x, 0.0 ) ); } /*-------------------------------------------------------------------------- * 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 ) { return 0; } /*-------------------------------------------------------------------------- * hypre_ParKrylovIdentity *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParKrylovIdentity( void *vdata, void *A, void *b, void *x ) { return( hypre_ParKrylovCopyVector( b, x ) ); } hypre-2.18.2/src/parcsr_ls/schwarz.c000066400000000000000000003460151355566575400173750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; /* PCG arrays: --------------------------------------------------- HYPRE_Real *x, *rhs, *v, *w, *d, *aux; HYPRE_Int max_iter; ------------------------------------------------------------------ */ /* 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 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=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; HYPRE_Int *A_offd_j; HYPRE_Real *A_offd_data; HYPRE_Real *x; HYPRE_Real *x_ext; HYPRE_Real *x_ext_old; HYPRE_Real *rhs; HYPRE_Real *rhs_ext; HYPRE_Real *vtemp_data; HYPRE_Real *aux; HYPRE_Real *buf_data; /*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; HYPRE_Int *A_boundary_j; HYPRE_Real *A_boundary_data; 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 -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 1) { hypre_parCorrRes(par_A,par_x,rhs_vector,&rhs); } else { rhs = hypre_VectorData(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] = rhs[j_domain_dof[j]]; for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_HOST); hypre_parCorrRes(par_A,par_x,rhs_vector,&rhs); } else rhs = hypre_VectorData(rhs_vector); */ /* 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] = rhs[j_domain_dof[j]]; for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_SHARED); } 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_Real *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 = hypre_VectorData(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] = rhs[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_HOST); hypre_parCorrRes(par_A,par_x,rhs_vector,&rhs); } else rhs = hypre_VectorData(rhs_vector); */ /* 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] = rhs[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_SHARED); } 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_Real *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 = hypre_VectorData(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] = rhs[j_domain_dof[j]]; for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_SHARED); } 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_Real *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 = hypre_VectorData(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] = rhs[j_domain_dof[j]]; if (CF_marker[j_domain_dof[j]] == rlx_pt) { for (k=i_dof_dof[j_domain_dof[j]]; k 1) { hypre_TFree(rhs, HYPRE_MEMORY_SHARED); } 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_TAlloc(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_faces; i++) i_face_element[i] = 0; 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) { /* 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++; } } } } free(j_local_element_edge); 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_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_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= 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 && 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 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]; if (last == head) weight_max = 0; else weight_max = 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 0) { weight = i_face_weight[j_face_face[j]]; last = previous[tail]; if (last == head) weight_max = 0; else weight_max = 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]; if (last == head) weight_max = 0; else weight_max = 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 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]; 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); /* 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 -1) for (k=i_face_element[j_element_face[j]]; k -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_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_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_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 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= 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 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= 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 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 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_Int i, j; HYPRE_Real *scale; HYPRE_Real *scale_ext; HYPRE_Real *scale_int; hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A); HYPRE_Int num_sends = 0; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int num_variables = hypre_ParCSRMatrixNumRows(A); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(A)); HYPRE_Int 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); if (num_cols_offd) 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++]; } if (comm_pkg) hypre_TFree(scale_int, HYPRE_MEMORY_HOST); if (num_cols_offd) 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; HYPRE_Real *scale_int; 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; 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++]; } if (comm_pkg) hypre_TFree(scale_int, HYPRE_MEMORY_HOST); if (num_cols_offd) { 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.18.2/src/parcsr_ls/schwarz.h000066400000000000000000000041731355566575400173760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_ls/superlu.c000066400000000000000000000117751355566575400174150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "superlu.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; LUstruct_t dslu_data_LU; SuperLUStat_t dslu_data_stat; superlu_dist_options_t dslu_options; gridinfo_t dslu_data_grid; ScalePermstruct_t dslu_ScalePermstruct; SOLVEstruct_t dslu_solve; } hypre_DSLUData; #endif 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 num_rows; HYPRE_Int num_procs, my_id; HYPRE_Int pcols=1, prows=1; hypre_DSLUData *dslu_data = NULL; HYPRE_Int info = 0; HYPRE_Int nrhs = 0; hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); dslu_data = hypre_CTAlloc(hypre_DSLUData, 1, HYPRE_MEMORY_HOST); /* Merge diag and offd into one matrix (global ids) */ A_local = hypre_MergeDiagAndOffd(A); num_rows = hypre_CSRMatrixNumRows(A_local); /* Now convert hypre matrix to a SuperMatrix */ dCreate_CompRowLoc_Matrix_dist( &(dslu_data->A_dslu),global_num_rows,global_num_rows, hypre_CSRMatrixNumNonzeros(A_local), num_rows, hypre_ParCSRMatrixFirstRowIndex(A), hypre_CSRMatrixData(A_local), hypre_CSRMatrixBigJ(A_local),hypre_CSRMatrixI(A_local), SLU_NR_loc, SLU_D, SLU_GE); hypre_CSRMatrixData(A_local) = NULL; hypre_CSRMatrixI(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; 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; */ ScalePermstructInit(global_num_rows, global_num_rows, &(dslu_data->dslu_ScalePermstruct)); LUstructInit(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; *solver = (HYPRE_Solver) dslu_data; return hypre_error_flag; } HYPRE_Int hypre_SLUDistSolve( void* solver, 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; } 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)); ScalePermstructFree(&(dslu_data->dslu_ScalePermstruct)); Destroy_LU(dslu_data->global_num_rows, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU)); LUstructFree(&(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.18.2/src/parcsr_mv/000077500000000000000000000000001355566575400155435ustar00rootroot00000000000000hypre-2.18.2/src/parcsr_mv/CMakeLists.txt000066400000000000000000000016061355566575400203060ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 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_matop.c par_csr_matrix.c par_csr_matop_marked.c par_csr_matvec.c par_vector.c par_make_system.c par_csr_triplemat.c ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/parcsr_mv/F90_HYPRE_parcsr_matrix.c000066400000000000000000000274401355566575400221610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/F90_HYPRE_parcsr_vector.c000066400000000000000000000175051355566575400221600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/F90_par_vector.c000066400000000000000000000134161355566575400204760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_SetParVectorPartitioningO *--------------------------------------------------------------------------*/ void hypre_F90_IFACE(hypre_setparvectorpartitioningo, HYPRE_SETPARVECTORPARTITIONINGO) ( hypre_F90_Obj *vector, hypre_F90_Int *owns_partitioning, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( hypre_ParVectorSetPartitioningOwner( (hypre_ParVector *) *vector, hypre_F90_PassInt (owns_partitioning) ) ); } /*-------------------------------------------------------------------------- * 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.18.2/src/parcsr_mv/F90_parcsr_matrix.c000066400000000000000000000032561355566575400212110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/HYPRE_parcsr_matrix.c000066400000000000000000000302611355566575400215360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/parcsr_mv/HYPRE_parcsr_mv.h000066400000000000000000000105221355566575400206570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/parcsr_mv/HYPRE_parcsr_vector.c000066400000000000000000000174741355566575400215470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/parcsr_mv/Makefile000066400000000000000000000065601355566575400172120ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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\ ${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\ 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_matop.c\ par_csr_matop_device.c\ par_csr_matrix.c\ par_csr_matop_marked.c\ par_csr_matvec.c\ par_csr_triplemat.c\ par_csr_triplemat_device.c\ par_vector.c\ par_make_system.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 OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} ${DRIVER_OBJS}: ${HEADERS} hypre-2.18.2/src/parcsr_mv/_hypre_parcsr_mv.h000066400000000000000000001531061355566575400212640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #ifndef hypre_PARCSR_MV_HEADER #define hypre_PARCSR_MV_HEADER #include "_hypre_utilities.h" #include "seq_mv.h" #ifdef __cplusplus extern "C" { #endif #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_Int send_memory_location; HYPRE_Int 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_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 /* temporary memory for matvec. cudaMalloc is expensive. alloc once and reuse */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Complex *tmp_data; HYPRE_Complex *buf_data; #endif } hypre_ParCSRCommPkg; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommPkg *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommPkgComm(comm_pkg) (comm_pkg -> comm) #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_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) #define hypre_ParCSRCommPkgTmpData(comm_pkg) ((comm_pkg) -> tmp_data) #define hypre_ParCSRCommPkgBufData(comm_pkg) ((comm_pkg) -> buf_data) #endif static inline void hypre_ParCSRCommPkgCopySendMapElmtsToDevice(hypre_ParCSRCommPkg *comm_pkg) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if (hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) == NULL) { HYPRE_Int num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg); 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); } #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 */ #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 */ #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 */ /****************************************************************************** * * 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; /* 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; HYPRE_Int owns_partitioning; hypre_IJAssumedPart *assumed_partition; /* only populated if no_global_partition option is used (compile-time option) AND 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_ParVectorLocalVector(vector) ((vector) -> local_vector) #define hypre_ParVectorOwnsData(vector) ((vector) -> owns_data) #define hypre_ParVectorOwnsPartitioning(vector) ((vector) -> owns_partitioning) #define hypre_ParVectorNumVectors(vector)\ (hypre_VectorNumVectors( hypre_ParVectorLocalVector(vector) )) #define hypre_ParVectorAssumedPartition(vector) ((vector) -> assumed_partition) #endif /****************************************************************************** * * 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 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; /* array of length num_procs+1, row_starts[i] contains the global number of the first row on proc i, first_row_index = row_starts[my_id], row_starts[num_procs] = global_num_rows */ HYPRE_BigInt *col_starts; /* array of length num_procs+1, col_starts[i] contains the global number of the first column of diag on proc i, first_col_diag = col_starts[my_id], col_starts[num_procs] = global_num_cols */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Does the ParCSRMatrix create/destroy `row_starts', `col_starts'? */ HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; HYPRE_BigInt num_nonzeros; HYPRE_Real d_num_nonzeros; /* 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; /* only populated if no_global_partition option is used (compile-time option)*/ 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; } 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_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_ParCSRMatrixOwnsRowStarts(matrix) ((matrix) -> owns_row_starts) #define hypre_ParCSRMatrixOwnsColStarts(matrix) ((matrix) -> owns_col_starts) #define hypre_ParCSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_ParCSRMatrixDNumNonzeros(matrix) ((matrix) -> d_num_nonzeros) #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) #define hypre_ParCSRMatrixNumRows(matrix) hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(matrix)) #define hypre_ParCSRMatrixNumCols(matrix) hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(matrix)) /*-------------------------------------------------------------------------- * 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 /****************************************************************************** * * 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; 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 ); #endif /****************************************************************************** * * Header info for Parallel Chord Matrix data structures * *****************************************************************************/ #include #ifndef hypre_PAR_CHORD_MATRIX_HEADER #define hypre_PAR_CHORD_MATRIX_HEADER #include "_hypre_utilities.h" #include "seq_mv.h" /*-------------------------------------------------------------------------- * 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 #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 */ /* 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_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_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_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); /* 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_LocateAssummedPartition ( 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 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_Int send_memory_location, void *send_data_in, HYPRE_Int 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_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_matop.c */ void hypre_ParMatmul_RowSizes ( HYPRE_Int **C_diag_i , HYPRE_Int **C_offd_i , 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_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_ParCSRMatrixTranspose ( 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_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, void **request_ptr); hypre_CSRMatrix* hypre_ExchangeExternalRowsDeviceWait(void *vrequest); #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_Int send_memory_location, void *send_data); void hypre_ParCSRPersistentCommHandleWait(hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_Int 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_ParcsrAdd( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout); /* 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 , HYPRE_BigInt *col_starts , 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_Int 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_ParCSRMatrixSetDataOwner ( hypre_ParCSRMatrix *matrix , HYPRE_Int owns_data ); HYPRE_Int hypre_ParCSRMatrixSetRowStartsOwner ( hypre_ParCSRMatrix *matrix , HYPRE_Int owns_row_starts ); HYPRE_Int hypre_ParCSRMatrixSetColStartsOwner ( hypre_ParCSRMatrix *matrix , HYPRE_Int owns_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_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_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_Int memory_location ); #ifdef HYPRE_USING_CUDA //hypre_int hypre_ParCSRMatrixIsManaged(hypre_ParCSRMatrix *a); #endif HYPRE_Int hypre_ParCSRMatrixDropSmallEntries( hypre_ParCSRMatrix *A, HYPRE_Real tol, HYPRE_Int type); /* 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 ); // 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_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_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 ); /* 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 ); 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_ParVectorInitialize ( hypre_ParVector *vector ); HYPRE_Int hypre_ParVectorSetDataOwner ( hypre_ParVector *vector , HYPRE_Int owns_data ); HYPRE_Int hypre_ParVectorSetPartitioningOwner ( hypre_ParVector *vector , HYPRE_Int owns_partitioning ); HYPRE_Int hypre_ParVectorSetNumVectors ( hypre_ParVector *vector , HYPRE_Int num_vectors ); hypre_ParVector *hypre_ParVectorRead ( MPI_Comm comm , const char *file_name ); HYPRE_Int hypre_ParVectorPrint ( hypre_ParVector *vector , const char *file_name ); HYPRE_Int hypre_ParVectorSetConstantValues ( hypre_ParVector *v , HYPRE_Complex value ); 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_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_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_Int hypre_ParVectorPrintIJ ( hypre_ParVector *vector , HYPRE_Int base_j , 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); #ifdef HYPRE_USING_CUDA //hypre_int hypre_ParVectorIsManaged(hypre_ParVector *vector); #endif #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/parcsr_mv/communicationT.c000066400000000000000000000562331355566575400207110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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*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*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*rowmax ? i : *rowmax; break; } } } for ( i=0; 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_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_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 $INTERNAL_HEADER <<@ #include #include "HYPRE_parcsr_mv.h" #ifndef hypre_PARCSR_MV_HEADER #define hypre_PARCSR_MV_HEADER #include "_hypre_utilities.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 ../utilities/protos [!F]*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/parcsr_mv/new_commpkg.c000066400000000000000000000631711355566575400202250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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_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; iproc_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 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; idata1; 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_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.18.2/src/parcsr_mv/new_commpkg.h000066400000000000000000000014151355566575400202230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/numbers.c000066400000000000000000000070531355566575400173670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_utilities.h" #include "numbers.h" hypre_NumbersNode * hypre_NumbersNewNode() /* 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; jdigit[10] != NULL ) array[k++] = 0; hypre_assert( k==N ); return array; } hypre-2.18.2/src/parcsr_mv/numbers.h000066400000000000000000000043761355566575400174010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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]; /* ... should be hypre_NumbersNode * digit[11]; */ } hypre_NumbersNode; 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 ); #endif hypre-2.18.2/src/parcsr_mv/par_chord_matrix.h000066400000000000000000000075321355566575400212500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 * *****************************************************************************/ #include #ifndef hypre_PAR_CHORD_MATRIX_HEADER #define hypre_PAR_CHORD_MATRIX_HEADER #include "_hypre_utilities.h" #include "seq_mv.h" /*-------------------------------------------------------------------------- * 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.18.2/src/parcsr_mv/par_csr_aat.c000066400000000000000000001111231355566575400201640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int 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 + 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 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 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 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 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; i3row_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.18.2/src/parcsr_mv/par_csr_assumed_part.c000066400000000000000000000444101355566575400221120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_LocateAssummedPartition * Reconcile assumed partition with actual partition. Essentially * each processor ends of with a partition of its assumed partition. *--------------------------------------------------------------------*/ HYPRE_Int hypre_LocateAssummedPartition(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; /*----------------------------------------------------------- * 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_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; ilength; 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); return hypre_error_flag; } hypre_IJAssumedPart* hypre_AssumedPartitionCreate(MPI_Comm comm, HYPRE_Int global_num, HYPRE_Int start, HYPRE_Int 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_LocateAssummedPartition(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_LocateAssummedPartition(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.18.2/src/parcsr_mv/par_csr_assumed_part.h000066400000000000000000000015371355566575400221220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/par_csr_bool_matop.c000066400000000000000000001324361355566575400215640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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; HYPRE_Int *Bs_ext_i; HYPRE_BigInt *Bs_ext_j; HYPRE_Int *B_ext_diag_i; HYPRE_Int *B_ext_diag_j; HYPRE_Int B_ext_diag_size; HYPRE_Int *B_ext_offd_i; HYPRE_Int *B_ext_offd_j; HYPRE_BigInt *B_tmp_offd_j; 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_Int 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,*/ &C_diag_i, &C_offd_i, 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_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_Int last_col_diag_C; HYPRE_Int num_cols_offd_C; hypre_CSRBooleanMatrix *A_ext; HYPRE_Int *A_ext_i; HYPRE_BigInt *A_ext_j; 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 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 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 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; HYPRE_Int *offd_j; 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 -1) { for ( i=0; i (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.18.2/src/parcsr_mv/par_csr_communication.c000066400000000000000000001273751355566575400223040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; } /** * 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_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]; } void hypre_ParCSRPersistentCommHandleDestroy( hypre_ParCSRPersistentCommHandle *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); } void hypre_ParCSRPersistentCommHandleStart( hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_Int 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__);*/ } } } void hypre_ParCSRPersistentCommHandleWait( hypre_ParCSRPersistentCommHandle *comm_handle, HYPRE_Int 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_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_ParCSRCommHandle* hypre_ParCSRCommHandleCreate_v2 ( HYPRE_Int job, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int send_memory_location, void *send_data_in, HYPRE_Int recv_memory_location, void *recv_data_in ) { 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 = 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 = 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 = 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. * 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 . *--------------------------------------------------------------------*/ #ifndef HYPRE_WITH_GPU_AWARE_MPI 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; } /* send from actually device memory */ if ( hypre_GetActualMemLocation(send_memory_location) == HYPRE_MEMORY_DEVICE ) { send_data = hypre_TAlloc(char, num_send_bytes, HYPRE_MEMORY_HOST); hypre_TMemcpy(send_data, send_data_in, char, num_send_bytes, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } else { send_data = send_data_in; } /* receive from actually device memory */ if ( hypre_GetActualMemLocation(recv_memory_location) == HYPRE_MEMORY_DEVICE ) { recv_data = hypre_TAlloc(char, num_recv_bytes, HYPRE_MEMORY_HOST); } else { recv_data = recv_data_in; } #else /* #ifndef HYPRE_WITH_GPU_AWARE_MPI */ send_data = send_data_in; recv_data = recv_data_in; #endif 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; return ( comm_handle ); } HYPRE_Int hypre_ParCSRCommHandleDestroy( hypre_ParCSRCommHandle *comm_handle ) { if ( comm_handle == NULL ) { return hypre_error_flag; } if (hypre_ParCSRCommHandleNumRequests(comm_handle)) { hypre_MPI_Status *status0; 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); } #ifndef HYPRE_WITH_GPU_AWARE_MPI if ( hypre_GetActualMemLocation(hypre_ParCSRCommHandleSendMemoryLocation(comm_handle)) == HYPRE_MEMORY_DEVICE ) { hypre_TFree(hypre_ParCSRCommHandleSendDataBuffer(comm_handle), HYPRE_MEMORY_HOST); } if ( hypre_GetActualMemLocation(hypre_ParCSRCommHandleRecvMemoryLocation(comm_handle)) == HYPRE_MEMORY_DEVICE ) { hypre_TMemcpy( hypre_ParCSRCommHandleRecvData(comm_handle), hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), char, hypre_ParCSRCommHandleNumRecvBytes(comm_handle), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST ); hypre_TFree(hypre_ParCSRCommHandleRecvDataBuffer(comm_handle), HYPRE_MEMORY_HOST); } #endif hypre_TFree(hypre_ParCSRCommHandleRequests(comm_handle), HYPRE_MEMORY_HOST); hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* hypre_MatCommPkgCreate_core does all the communications and computations for hypre_MatCommPkgCreate ( hypre_ParCSRMatrix *A) and hypre_BoolMatCommPkgCreate ( 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; hypre_MPI_Status *status; 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 * ---------------------------------------------------------------------*/ for (i=0; i < num_procs; i++) proc_add[i] = 0; proc_num = 0; if (num_cols_offd) offd_col = col_map_offd[0]; num_recvs=0; j = 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++; if (j < num_cols_offd) i = j-1; else i=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); displs[0] = 0; 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; if (num_recvs) recv_vec_starts[0] = 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); } if (num_sends) send_map_starts[0] = 0; 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; ipersistent_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_CUDA) || defined(HYPRE_USING_DEVICE_MEMORY) hypre_TFree(hypre_ParCSRCommPkgTmpData(comm_pkg), HYPRE_MEMORY_DEVICE); hypre_TFree(hypre_ParCSRCommPkgBufData(comm_pkg), HYPRE_MEMORY_DEVICE); #endif hypre_TFree(comm_pkg, HYPRE_MEMORY_HOST); return hypre_error_flag; } /* 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) { /*----------------------------------------------------------- * setup commpkg *----------------------------------------------------------*/ hypre_ParCSRCommPkg *new_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); *extend_comm_pkg = new_comm_pkg; #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_assert(apart != NULL); hypre_ParCSRCommPkgCreateApart ( comm, indices, my_first, indices_len, global_num, apart, new_comm_pkg ); #else hypre_ParCSRCommPkgCreate ( comm, indices, my_first, starts, local_num, indices_len, new_comm_pkg ); #endif return hypre_error_flag; } 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_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.18.2/src/parcsr_mv/par_csr_communication.h000066400000000000000000000110331355566575400222700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *--------------------------------------------------------------------------*/ #define HYPRE_USING_PERSISTENT_COMM // JSP: can be defined by configure #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; typedef struct { void *send_data; void *recv_data; HYPRE_Int num_requests; hypre_MPI_Request *requests; HYPRE_Int own_send_data, own_recv_data; } hypre_ParCSRPersistentCommHandle; #endif typedef struct { MPI_Comm comm; 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; /* 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 } hypre_ParCSRCommPkg; /*-------------------------------------------------------------------------- * hypre_ParCSRCommHandle: *--------------------------------------------------------------------------*/ typedef struct { hypre_ParCSRCommPkg *comm_pkg; void *send_data; void *recv_data; HYPRE_Int num_requests; hypre_MPI_Request *requests; } hypre_ParCSRCommHandle; /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommPkg *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommPkgComm(comm_pkg) (comm_pkg -> comm) #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_ParCSRCommPkgSendMapElmt(comm_pkg,i) (comm_pkg -> 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]) /*-------------------------------------------------------------------------- * Accessor macros: hypre_ParCSRCommHandle *--------------------------------------------------------------------------*/ #define hypre_ParCSRCommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg) #define hypre_ParCSRCommHandleSendData(comm_handle) (comm_handle -> send_data) #define hypre_ParCSRCommHandleRecvData(comm_handle) (comm_handle -> recv_data) #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.18.2/src/parcsr_mv/par_csr_matop.c000066400000000000000000006004341355566575400205470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_hopscotch_hash.h" #include "_hypre_parcsr_mv.h" #include "_hypre_lapack.h" #include "_hypre_blas.h" /* The following function was formerly part of hypre_ParMatmul but was removed so it can also be used for multiplication of Boolean matrices */ void hypre_ParMatmul_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_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 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 */ HYPRE_Int num_threads = hypre_NumThreads(); HYPRE_Int *jj_count_diag_array; HYPRE_Int *jj_count_offd_array; HYPRE_Int ii, size, rest; /* First pass begins here. Computes sizes of 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_SHARED); *C_offd_i = hypre_CTAlloc(HYPRE_Int, num_rows_diag_A+1, HYPRE_MEMORY_SHARED); 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 *-----------------------------------------------------------------------*/ size = num_rows_diag_A/num_threads; rest = num_rows_diag_A - size*num_threads; #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(ii, i1, jj_row_begin_diag, jj_row_begin_offd, jj_count_diag, jj_count_offd, jj2, i2, jj3, i3) #endif /*for (ii=0; ii < num_threads; ii++)*/ { HYPRE_Int *B_marker = NULL; HYPRE_Int ns, ne; 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++) { /*-------------------------------------------------------------------- * 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]; /*----------------------------------------------------------- * 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]; /*----------------------------------------------------------- * 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; } 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 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++) { (*C_diag_i)[i1] += jj_count_diag; (*C_offd_i)[i1] += 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]; } } } /* end parallel loop */ /*----------------------------------------------------------------------- * Allocate C_diag_data and C_diag_j arrays. * Allocate C_offd_data and C_offd_j arrays. *-----------------------------------------------------------------------*/ *C_diag_size = (*C_diag_i)[num_rows_diag_A]; *C_offd_size = (*C_offd_i)[num_rows_diag_A]; 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 * Note that C does not own the partitionings since its row_starts * is owned by A and col_starts by B. *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix *hypre_ParMatmul( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATMUL] -= hypre_MPI_Wtime(); #endif 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 *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_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_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; HYPRE_Int *map_B_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 *Bs_ext; HYPRE_Complex *Bs_ext_data; HYPRE_Int *Bs_ext_i; HYPRE_BigInt *Bs_ext_j; HYPRE_Complex *B_ext_diag_data; HYPRE_Int *B_ext_diag_i; HYPRE_Int *B_ext_diag_j; HYPRE_Int B_ext_diag_size; HYPRE_Complex *B_ext_offd_data; HYPRE_Int *B_ext_offd_i; HYPRE_Int *B_ext_offd_j; HYPRE_BigInt *B_big_offd_j = NULL; HYPRE_Int B_ext_offd_size; HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_BigInt n_rows_B, n_cols_B; 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; n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); n_rows_B = hypre_ParCSRMatrixGlobalNumRows(B); n_cols_B = hypre_ParCSRMatrixGlobalNumCols(B); 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 (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 globally C=A*B is square and locally C_diag should also be square */ if ( num_rows_diag_A == num_cols_diag_B && n_rows_A == n_cols_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); #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; 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; #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_ParMatmul_RowSizes( /*&C_diag_i, &C_offd_i, &B_marker,*/ &C_diag_i, &C_offd_i, 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_cols_offd_A, allsquare, num_cols_diag_B, num_cols_offd_B, num_cols_offd_C ); /*----------------------------------------------------------------------- * 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, HYPRE_MEMORY_SHARED); C_diag_j = hypre_CTAlloc(HYPRE_Int, C_diag_size, HYPRE_MEMORY_SHARED); if (C_offd_size) { C_offd_data = hypre_CTAlloc(HYPRE_Complex, C_offd_size, HYPRE_MEMORY_SHARED); C_offd_j = hypre_CTAlloc(HYPRE_Int, C_offd_size, HYPRE_MEMORY_SHARED); } /*----------------------------------------------------------------------- * 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. *-----------------------------------------------------------------------*/ #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int ns, ne, size, rest, ii; HYPRE_Int i1, 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;*/ ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); size = num_rows_diag_A/num_threads; rest = num_rows_diag_A - 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; } jj_count_diag = C_diag_i[ns]; jj_count_offd = C_offd_i[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++) { /*-------------------------------------------------------------------- * 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_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[i1]; jj2 < A_offd_i[i1+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_{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_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 i1 of A_diag. *-----------------------------------------------------------------*/ 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 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_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_{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_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 */ C = hypre_ParCSRMatrixCreate(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_ParCSRMatrixSetRowStartsOwner(C,0); hypre_ParCSRMatrixSetColStartsOwner(C,0); 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(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); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_MATMUL] += hypre_MPI_Wtime(); #endif return C; } /* 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_ParCSRCommHandle *comm_handle, *row_map_comm_handle = NULL; hypre_ParCSRCommPkg *tmp_comm_pkg; 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; HYPRE_Complex * B_int_data; HYPRE_BigInt * B_int_row_map; HYPRE_BigInt * B_ext_row_map; 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); #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt first_row_index = row_starts[0]; #else HYPRE_BigInt first_row_index = row_starts[my_id]; HYPRE_Int *send_procs = hypre_ParCSRCommPkgSendProcs(comm_pkg); #endif 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) { #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_Int send_proc = send_procs[i]; HYPRE_BigInt send_proc_first_row = row_starts[send_proc]; HYPRE_BigInt send_proc_last_row = row_starts[send_proc + 1]; #endif 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++) { #ifdef HYPRE_NO_GLOBAL_PARTITION if (offd_data[k] < 0) len++; #else HYPRE_Int c = offd_j[k]; HYPRE_BigInt c_global = col_map_offd[c]; if (offd_data[k] < 0 && (CF_marker_offd[c] >= 0 || (c_global >= send_proc_first_row && c_global < send_proc_last_row))) len++; #endif } } 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++) { #ifdef HYPRE_NO_GLOBAL_PARTITION if (offd_data[k] > 0) len++; #else HYPRE_Int c = offd_j[k]; HYPRE_BigInt c_global = col_map_offd[c]; if (offd_data[k] > 0 && (CF_marker_offd[c] >= 0 || (c_global >= send_proc_first_row && c_global < send_proc_last_row))) len++; #endif } } 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) { #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_Int send_proc = send_procs[i]; HYPRE_BigInt send_proc_first_row = row_starts[send_proc]; HYPRE_BigInt send_proc_last_row = row_starts[send_proc + 1]; #endif 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]; #ifdef HYPRE_NO_GLOBAL_PARTITION if (offd_data[k] < 0) #else if (offd_data[k] < 0 && (CF_marker_offd[c] >= 0 || (c_global >= send_proc_first_row && c_global < send_proc_last_row))) #endif { 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]; #ifdef HYPRE_NO_GLOBAL_PARTITION if (offd_data[k] > 0) #else if (offd_data[k] > 0 && (CF_marker_offd[c] >= 0 || (c_global >= send_proc_first_row && c_global < send_proc_last_row))) #endif { 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); tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(tmp_comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgSendProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgRecvProcs(tmp_comm_pkg) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = jdata_send_map_starts; 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]]; } hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = jdata_recv_vec_starts; *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); } if (row_map_comm_handle) { hypre_ParCSRCommHandleDestroy(row_map_comm_handle); row_map_comm_handle = NULL; } 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); if ( find_row_map ) hypre_TFree(B_int_row_map, HYPRE_MEMORY_HOST); /* end generic part */ } 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_assert( hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B))) != HYPRE_MEMORY_DEVICE ); 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_ParCSRMatrixTranspose *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixTranspose( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix **AT_ptr, HYPRE_Int data ) { hypre_ParCSRCommHandle *comm_handle; 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 ierr = 0; HYPRE_Int num_sends, num_recvs, 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; HYPRE_Int *AT_buf_i; HYPRE_BigInt *AT_buf_j; HYPRE_Complex *AT_buf_data; 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; HYPRE_BigInt *col_starts_AT; HYPRE_Int num_procs, my_id; HYPRE_Int *recv_procs; HYPRE_Int *send_procs; HYPRE_Int *recv_vec_starts; HYPRE_Int *send_map_starts; HYPRE_Int *send_map_elmts; HYPRE_Int *tmp_recv_vec_starts; HYPRE_Int *tmp_send_map_starts; hypre_ParCSRCommPkg *tmp_comm_pkg; 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; /*--------------------------------------------------------------------- * 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, HYPRE_MEMORY_SHARED); 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]; } } tmp_comm_pkg = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(tmp_comm_pkg) = comm; hypre_ParCSRCommPkgNumSends(tmp_comm_pkg) = num_sends; hypre_ParCSRCommPkgNumRecvs(tmp_comm_pkg) = num_recvs; hypre_ParCSRCommPkgRecvProcs(tmp_comm_pkg) = recv_procs; hypre_ParCSRCommPkgSendProcs(tmp_comm_pkg) = send_procs; hypre_ParCSRCommPkgRecvVecStarts(tmp_comm_pkg) = tmp_recv_vec_starts; hypre_ParCSRCommPkgSendMapStarts(tmp_comm_pkg) = tmp_send_map_starts; 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); AT_big_j = NULL; 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], HYPRE_MEMORY_SHARED); 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], HYPRE_MEMORY_SHARED); } 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_CSRMatrixI(AT_offd) = AT_offd_i; hypre_CSRMatrixJ(AT_offd) = AT_offd_j; hypre_CSRMatrixData(AT_offd) = AT_offd_data; #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts_AT = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i=0; i < 2; i++) row_starts_AT[i] = col_starts[i]; if (row_starts != col_starts) { col_starts_AT = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); for (i=0; i < 2; i++) col_starts_AT[i] = row_starts[i]; } else { col_starts_AT = row_starts_AT; } 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); #else row_starts_AT = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) row_starts_AT[i] = col_starts[i]; if (row_starts != col_starts) { col_starts_AT = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) col_starts_AT[i] = row_starts[i]; } else { col_starts_AT = row_starts_AT; } first_row_index_AT = row_starts_AT[my_id]; first_col_diag_AT = col_starts_AT[my_id]; local_num_rows_AT = (HYPRE_Int)(row_starts_AT[my_id+1]-first_row_index_AT ); local_num_cols_AT = (HYPRE_Int)(col_starts_AT[my_id+1]-first_col_diag_AT); #endif 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) = row_starts_AT; hypre_ParCSRMatrixColStarts(AT) = col_starts_AT; 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_ParCSRMatrixOwnsRowStarts(AT) = 1; hypre_ParCSRMatrixOwnsColStarts(AT) = 1; if (row_starts_AT == col_starts_AT) { hypre_ParCSRMatrixOwnsColStarts(AT) = 0; } 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 ierr; } /* ----------------------------------------------------------------------------- * 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]; free(counts); } /* 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++; } } } } } free(nodes_marked); free(queue); free(GT_diag_mat); /* 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); free(recv_cnts); /* 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; } free(nodes_marked); free(queue); free(pgraph_i); free(pgraph_j); } /* 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) free(children); /* 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; free(edges_marked); if (G_type != 0) { free(G_diag_i); free(G_diag_j); } } /* ----------------------------------------------------------------------------- * 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; #ifdef HYPRE_NO_GLOBAL_PARTITION /* This case is not yet implemented! */ global_nrows = 0; global_ncols = 0; row_starts = NULL; col_starts = NULL; #else global_nrows = proc_offsets1[nprocs]; global_ncols = 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] = proc_offsets1[i]; col_starts[i] = proc_offsets1[i]; } #endif 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_error(HYPRE_ERROR_GENERIC); /*hypre_printf("WARNING WARNING WARNING\n");*/ 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; /* ----------------------------------------------------- * 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; /* ----------------------------------------------------- * 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; /* ----------------------------------------------------- * 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; free(proc_offsets1); free(proc_offsets2); free(exp_indices); } /* ----------------------------------------------------------------------------- * 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; /* ----------------------------------------------------- * 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; /* ----------------------------------------------------- * hand the matrices back to the caller and clean up * ----------------------------------------------------- */ (*submatrices)[0] = A11_csr; (*submatrices)[1] = A21_csr; free(proc_offsets1); free(proc_offsets2); free(exp_indices); } /* ----------------------------------------------------------------------------- * 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_ParCSRMatrix *C = NULL; 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, 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_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; 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; /*HYPRE_Int *C_diag_array; HYPRE_Int *C_offd_array;*/ 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(); /*C_diag_array = hypre_CTAlloc(HYPRE_Int, num_threads); C_offd_array = hypre_CTAlloc(HYPRE_Int, num_threads, HYPRE_MEMORY_HOST);*/ /*--------------------------------------------------------------------- * 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]; comm_pkg_C = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_C) = comm; hypre_ParCSRCommPkgNumRecvs(comm_pkg_C) = num_recvs_B; hypre_ParCSRCommPkgRecvProcs(comm_pkg_C) = recv_procs_C; hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_C) = recv_vec_starts_C; hypre_ParCSRCommPkgNumSends(comm_pkg_C) = num_sends_B; hypre_ParCSRCommPkgSendProcs(comm_pkg_C) = send_procs_C; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_C) = send_map_starts_C; hypre_ParCSRCommPkgSendMapElmts(comm_pkg_C) = send_map_elmts_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; 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; HYPRE_BigInt *C_ext_j; HYPRE_Complex *C_ext_data; HYPRE_Int *C_ext_diag_i; HYPRE_Int *C_ext_diag_j; HYPRE_Complex *C_ext_diag_data; HYPRE_Int *C_ext_offd_i; HYPRE_Int *C_ext_offd_j; HYPRE_Complex *C_ext_offd_data; 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; HYPRE_Complex *C_tmp_diag_data; HYPRE_Int *C_tmp_offd_i; HYPRE_Int *C_tmp_offd_j; HYPRE_Complex *C_tmp_offd_data; 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; HYPRE_Int *send_map_elmts_A; HYPRE_Int num_sends_A; HYPRE_Int num_cols_offd_C = 0; HYPRE_Int *P_marker; HYPRE_Int i, j; HYPRE_Int i1, j_indx; 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_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; 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); max_num_threads = hypre_NumThreads(); 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;*/ 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_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 * and 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, HYPRE_MEMORY_SHARED); C_offd_i = hypre_CTAlloc(HYPRE_Int, num_cols_diag_A+1, HYPRE_MEMORY_SHARED); 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(C_diag); C_diag_j = hypre_CSRMatrixJ(C_diag); C_diag_data = hypre_CSRMatrixData(C_diag); hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_CSRMatrixInitialize(C_offd); 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; 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, n_cols_A, n_cols_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)); */ #ifdef HYPRE_NO_GLOBAL_PARTITION /* 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); #else first_row_index = col_starts_A[my_id]; local_num_rows = (HYPRE_Int)(col_starts_A[my_id+1]-first_row_index); first_col_diag = col_starts_B[my_id]; local_num_cols = (HYPRE_Int)(col_starts_B[my_id+1]-first_col_diag); #endif C = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixComm(C) = comm; hypre_ParCSRMatrixGlobalNumRows(C) = n_cols_A; hypre_ParCSRMatrixGlobalNumCols(C) = n_cols_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_ParCSRMatrixRowStarts(C) = col_starts_A; hypre_ParCSRMatrixColStarts(C) = col_starts_B; hypre_ParCSRMatrixCommPkg(C) = NULL; hypre_ParCSRMatrixCommPkgT(C) = NULL; /* set defaults */ hypre_ParCSRMatrixOwnsData(C) = 1; hypre_ParCSRMatrixRowindices(C) = NULL; hypre_ParCSRMatrixRowvalues(C) = NULL; hypre_ParCSRMatrixGetrowactive(C) = 0; /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C,0); hypre_ParCSRMatrixSetColStartsOwner(C,0); if (C_diag) hypre_ParCSRMatrixDiag(C) = C_diag; else hypre_ParCSRMatrixDiag(C) = C_tmp_diag; if (C_offd) hypre_ParCSRMatrixOffd(C) = C_offd; else hypre_ParCSRMatrixOffd(C) = C_tmp_offd; 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); return C; } 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, 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; #ifdef HYPRE_NO_GLOBAL_PARTITION j = 2; #else j = num_procs + 1; #endif HYPRE_BigInt *part = hypre_TAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); memcpy(part, hypre_ParVectorPartitioning(b), j*sizeof(HYPRE_BigInt)); hypre_ParVector *bnew = hypre_ParVectorCreate( hypre_ParVectorComm(b), hypre_ParVectorGlobalSize(b), part ); 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; } /** * @brief Compute As = B^{-1}*A, where B is the block diagonal of A * @param[in] A : * @param[in] blockSize: block size * @param[out] B : * @return * @warning */ 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_BigInt *row_starts_new, *col_starts_new; 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 = 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 = 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; } #ifdef HYPRE_NO_GLOBAL_PARTITION j = 2; #else j = num_procs + 1; #endif row_starts_new = hypre_CTAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); col_starts_new = hypre_CTAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); memcpy(row_starts_new, hypre_ParCSRMatrixRowStarts(A), j*sizeof(HYPRE_BigInt)); memcpy(col_starts_new, hypre_ParCSRMatrixColStarts(A), j*sizeof(HYPRE_BigInt)); /* Now, we should have everything of Parcsr matrix As */ Anew = hypre_ParCSRMatrixCreate(comm, nrow_global, ncol_global, row_starts_new, col_starts_new, 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_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_Int i, j, k; HYPRE_Int num_sends, num_rows_send, num_nnz_send, *send_i, num_recvs, num_rows_recv, num_nnz_recv, *recv_i, *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; 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_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); /* HYPRE_Int local_num_rows = hypre_CSRMatrixNumRows(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_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(A); */ /* HYPRE_BigInt first_row = hypre_ParCSRMatrixFirstRowIndex(A); */ HYPRE_BigInt first_col = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_BigInt *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(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 */ 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]; } /* ready to send and recv: create a communication package for data */ comm_pkg_j = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm (comm_pkg_j) = comm; hypre_ParCSRCommPkgNumSends (comm_pkg_j) = num_sends; hypre_ParCSRCommPkgSendProcs (comm_pkg_j) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j) = send_jstarts; hypre_ParCSRCommPkgNumRecvs (comm_pkg_j) = num_recvs; hypre_ParCSRCommPkgRecvProcs (comm_pkg_j) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j) = recv_jstarts; /* 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_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; } /* C = alpha * A + beta * B * A and B are assumed to have the same row and column partitionings */ HYPRE_Int hypre_ParcsrAdd( HYPRE_Complex alpha, hypre_ParCSRMatrix *A, HYPRE_Complex beta, hypre_ParCSRMatrix *B, hypre_ParCSRMatrix **Cout ) { 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; /* 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); HYPRE_Int *A2C_offd = hypre_TAlloc(HYPRE_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); HYPRE_BigInt nrow_global = hypre_ParCSRMatrixGlobalNumRows(A); HYPRE_BigInt ncol_global = hypre_ParCSRMatrixGlobalNumCols(A); HYPRE_Int nrow_local = hypre_CSRMatrixNumRows(A_diag); HYPRE_Int ncol_local = hypre_CSRMatrixNumCols(A_diag); HYPRE_Int nnz_diag_A = A_diag_i[nrow_local]; HYPRE_Int nnz_offd_A = A_offd_i[nrow_local]; /* diag part of B */ hypre_CSRMatrix *B_diag = hypre_ParCSRMatrixDiag(B); HYPRE_Complex *B_diag_a = hypre_CSRMatrixData(B_diag); HYPRE_Int *B_diag_i = hypre_CSRMatrixI(B_diag); HYPRE_Int *B_diag_j = hypre_CSRMatrixJ(B_diag); /* off-diag part of B */ hypre_CSRMatrix *B_offd = hypre_ParCSRMatrixOffd(B); HYPRE_Complex *B_offd_a = 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_B_offd = hypre_CSRMatrixNumCols(B_offd); HYPRE_BigInt *col_map_offd_B = hypre_ParCSRMatrixColMapOffd(B); HYPRE_Int *B2C_offd = hypre_TAlloc(HYPRE_Int, num_cols_B_offd, HYPRE_MEMORY_HOST); hypre_assert(nrow_global == hypre_ParCSRMatrixGlobalNumRows(B)); hypre_assert(ncol_global == hypre_ParCSRMatrixGlobalNumCols(B)); hypre_assert(nrow_local == hypre_CSRMatrixNumRows(B_diag)); hypre_assert(ncol_local == hypre_CSRMatrixNumCols(B_diag)); HYPRE_Int nnz_diag_B = B_diag_i[nrow_local]; HYPRE_Int nnz_offd_B = B_offd_i[nrow_local]; /* C */ hypre_ParCSRMatrix *C; HYPRE_BigInt *row_starts_C, *col_starts_C; hypre_CSRMatrix *C_diag; hypre_CSRMatrix *C_offd; HYPRE_Int num_cols_C_offd = num_cols_A_offd + num_cols_B_offd; HYPRE_BigInt *col_map_offd_C = hypre_TAlloc(HYPRE_BigInt, num_cols_C_offd, HYPRE_MEMORY_HOST); HYPRE_Int nnz_diag_C_alloc = nnz_diag_A + nnz_diag_B; HYPRE_Int nnz_offd_C_alloc = nnz_offd_A + nnz_offd_B; HYPRE_Int nnz_diag_C = 0, nnz_offd_C = 0; HYPRE_Int *C_diag_i = hypre_CTAlloc(HYPRE_Int, nrow_local + 1, HYPRE_MEMORY_HOST); HYPRE_Int *C_diag_j = hypre_CTAlloc(HYPRE_Int, nnz_diag_C_alloc, HYPRE_MEMORY_HOST); HYPRE_Complex *C_diag_a = hypre_CTAlloc(HYPRE_Complex, nnz_diag_C_alloc, HYPRE_MEMORY_HOST); HYPRE_Int *C_offd_i = hypre_CTAlloc(HYPRE_Int, nrow_local + 1, HYPRE_MEMORY_HOST); HYPRE_Int *C_offd_j = hypre_CTAlloc(HYPRE_Int, nnz_offd_C_alloc, HYPRE_MEMORY_HOST); HYPRE_Complex *C_offd_a = hypre_CTAlloc(HYPRE_Complex, nnz_offd_C_alloc, HYPRE_MEMORY_HOST); hypre_union2( num_cols_A_offd, col_map_offd_A, num_cols_B_offd, col_map_offd_B, &num_cols_C_offd, col_map_offd_C, A2C_offd, B2C_offd ); HYPRE_Int *marker_diag = hypre_TAlloc(HYPRE_Int, ncol_local, HYPRE_MEMORY_HOST); HYPRE_Int *marker_offd = hypre_TAlloc(HYPRE_Int, num_cols_C_offd, HYPRE_MEMORY_HOST); for (i = 0; i < ncol_local; i++) { marker_diag[i] = -1; } for (i = 0; i < num_cols_C_offd; i++) { marker_offd[i] = -1; } /* main loop for each row i */ for (i = 0; i < nrow_local; i++) { HYPRE_Int diag_i_start = nnz_diag_C; HYPRE_Int offd_i_start = nnz_offd_C; 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 (marker_diag[col] < diag_i_start) { /* this col has not been seen before, create new entry */ marker_diag[col] = nnz_diag_C; C_diag_j[nnz_diag_C] = col; C_diag_a[nnz_diag_C] = alpha * val; nnz_diag_C ++; } else { /* this should not happen */ hypre_printf("hypre warning: invalid ParCSR matrix %s %s %d\n", __FILE__, __func__, __LINE__); } } for (j = B_diag_i[i]; j < B_diag_i[i+1]; j++) { HYPRE_Int col = B_diag_j[j]; HYPRE_Complex val = B_diag_a[j]; if (marker_diag[col] < diag_i_start) { /* this col has not been seen before, create new entry */ marker_diag[col] = nnz_diag_C; C_diag_j[nnz_diag_C] = col; C_diag_a[nnz_diag_C] = beta * val; nnz_diag_C ++; } else { /* existing entry, update */ HYPRE_Int p = marker_diag[col]; hypre_assert(C_diag_j[p] == col); C_diag_a[p] += beta * val; } } C_diag_i[i+1] = nnz_diag_C; if (num_procs <= 1) { continue; } for (j = A_offd_i[i]; j < A_offd_i[i+1]; j++) { HYPRE_Int colA = A_offd_j[j]; HYPRE_Int colC = A2C_offd[colA]; HYPRE_Complex val = A_offd_a[j]; if (marker_offd[colC] < offd_i_start) { /* this col has not been seen before, create new entry */ marker_offd[colC] = nnz_offd_C; C_offd_j[nnz_offd_C] = colC; C_offd_a[nnz_offd_C] = alpha * val; nnz_offd_C ++; } else { /* this should not happen */ hypre_printf("hypre warning: invalid ParCSR matrix %s %s %d\n", __FILE__, __func__, __LINE__); } } for (j = B_offd_i[i]; j < B_offd_i[i+1]; j++) { HYPRE_Int colB = B_offd_j[j]; HYPRE_Int colC = B2C_offd[colB]; HYPRE_Complex val = B_offd_a[j]; if (marker_offd[colC] < offd_i_start) { /* this col has not been seen before, create new entry */ marker_offd[colC] = nnz_offd_C; C_offd_j[nnz_offd_C] = colC; C_offd_a[nnz_offd_C] = beta * val; nnz_offd_C ++; } else { /* existing entry, update */ HYPRE_Int p = marker_offd[colC]; hypre_assert(C_offd_j[p] == colC); C_offd_a[p] += beta * val; } } C_offd_i[i+1] = nnz_offd_C; } #ifdef HYPRE_NO_GLOBAL_PARTITION j = 2; #else j = num_procs + 1; #endif row_starts_C = hypre_TAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); col_starts_C = hypre_TAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); memcpy(row_starts_C, hypre_ParCSRMatrixRowStarts(A), j*sizeof(HYPRE_BigInt)); memcpy(col_starts_C, hypre_ParCSRMatrixColStarts(A), j*sizeof(HYPRE_BigInt)); /* Now, we should have everything of Parcsr matrix C */ C = hypre_ParCSRMatrixCreate(comm, nrow_global, ncol_global, row_starts_C, col_starts_C, num_cols_C_offd, nnz_diag_C, nnz_offd_C); C_diag = hypre_ParCSRMatrixDiag(C); hypre_CSRMatrixData(C_diag) = C_diag_a; hypre_CSRMatrixI(C_diag) = C_diag_i; hypre_CSRMatrixJ(C_diag) = C_diag_j; hypre_CSRMatrixMemoryLocation(C_diag) = HYPRE_MEMORY_HOST; C_offd = hypre_ParCSRMatrixOffd(C); hypre_CSRMatrixData(C_offd) = C_offd_a; hypre_CSRMatrixI(C_offd) = C_offd_i; hypre_CSRMatrixJ(C_offd) = C_offd_j; hypre_CSRMatrixMemoryLocation(C_offd) = HYPRE_MEMORY_HOST; 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); *Cout = C; /* done */ hypre_TFree(A2C_offd, HYPRE_MEMORY_HOST); hypre_TFree(B2C_offd, HYPRE_MEMORY_HOST); hypre_TFree(marker_diag, HYPRE_MEMORY_HOST); hypre_TFree(marker_offd, HYPRE_MEMORY_HOST); return hypre_error_flag; } 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 sqrt(result); } 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; 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]]; } comm_pkg_j = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_j) = comm; hypre_ParCSRCommPkgNumSends(comm_pkg_j) = num_recvs; hypre_ParCSRCommPkgNumRecvs(comm_pkg_j) = num_sends; hypre_ParCSRCommPkgSendProcs(comm_pkg_j) = recv_procs; hypre_ParCSRCommPkgRecvProcs(comm_pkg_j) = send_procs; 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]]; } /* note the order of send/recv is reversed */ hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j) = jdata_send_map_starts; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j) = jdata_recv_vec_starts; /* 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_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; } /* ----------------------------------------------------------------------------- * extract submatrix A_{FF}, A_{FC}, A_{CF} or A_{CC} * char job[2] = "FF", "FC", "CF" or "CC" * ----------------------------------------------------------------------------- */ HYPRE_Int hypre_ParCSRMatrixExtractSubmatrixFC( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker, HYPRE_BigInt *cpts_starts_in, 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, *cpts_starts; HYPRE_Int nf_local, nc_local; HYPRE_Int row_set, col_set; HYPRE_BigInt *B_row_starts, *B_col_starts, B_first_col; HYPRE_Int my_id, num_procs, *sub_idx_diag, *sub_idx_offd; HYPRE_Int num_sends, *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) { /* copy cpts_starts first */ HYPRE_Int len; #ifdef HYPRE_NO_GLOBAL_PARTITION len = 2; #else len = num_procs + 1; #endif cpts_starts = hypre_TAlloc(HYPRE_BigInt, len, HYPRE_MEMORY_HOST); memcpy(cpts_starts, cpts_starts_in, len*sizeof(HYPRE_BigInt)); #ifdef HYPRE_NO_GLOBAL_PARTITION if (my_id == (num_procs -1)) { total_global_cpts = cpts_starts[1]; } hypre_MPI_Bcast(&total_global_cpts, 1, HYPRE_MPI_INT, num_procs-1, comm); nc_local = (HYPRE_Int)(cpts_starts[1] - cpts_starts[0]); #else total_global_cpts = cpts_starts[num_procs]; nc_local = (HYPRE_Int)(cpts_starts[my_id+1] - cpts_starts[my_id]); #endif } /*-------------- 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++; } } #ifdef HYPRE_NO_GLOBAL_PARTITION fpts_starts = hypre_TAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); hypre_MPI_Scan(&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_INT, num_procs-1, comm); #else fpts_starts = hypre_TAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); hypre_MPI_Allgather(&nf_local, 1, HYPRE_MPI_BIG_INT, &fpts_starts[1], 1, HYPRE_MPI_INT, comm); for (i = 2; i < num_procs+1; i++) { fpts_starts[i] += fpts_starts[i-1]; } total_global_fpts = fpts_starts[num_procs]; #endif } 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION B_first_col = B_col_starts[0]; #else B_first_col = B_col_starts[my_id]; #endif /* 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_Int, 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_Int 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_Int, num_cols_A_offd, HYPRE_MEMORY_HOST); /* create a handle to start communication. 11: for integer */ comm_handle = hypre_ParCSRCommHandleCreate(11, 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 = 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_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_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-2.18.2/src/parcsr_mv/par_csr_matop_device.c000066400000000000000000000517131355566575400220660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_hopscotch_hash.h" #include "_hypre_parcsr_mv.h" #include "_hypre_lapack.h" #include "_hypre_blas.h" #if defined(HYPRE_USING_CUDA) HYPRE_Int hypre_ParcsrGetExternalRowsDeviceInit( hypre_ParCSRMatrix *A, HYPRE_Int indices_len, HYPRE_Int *indices, hypre_ParCSRCommPkg *comm_pkg, HYPRE_Int want_data, void **request_ptr) { 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; 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_Int first_col = hypre_ParCSRMatrixFirstColDiag(A); HYPRE_Int *col_map_offd_A = hypre_ParCSRMatrixColMapOffd(A); HYPRE_Int num_cols_A_offd = hypre_CSRMatrixNumCols(A_offd); HYPRE_Int *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_Int, num_cols_A_offd, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_col_map_offd_A, col_map_offd_A, HYPRE_Int, 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 */ comm_pkg_j = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm (comm_pkg_j) = comm; hypre_ParCSRCommPkgNumSends (comm_pkg_j) = num_sends; hypre_ParCSRCommPkgSendProcs (comm_pkg_j) = hypre_ParCSRCommPkgSendProcs(comm_pkg); hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j) = send_jstarts; hypre_ParCSRCommPkgNumRecvs (comm_pkg_j) = num_recvs; hypre_ParCSRCommPkgRecvProcs (comm_pkg_j) = hypre_ParCSRCommPkgRecvProcs(comm_pkg); hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j) = recv_jstarts; /* 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_ParCSRCommHandleDestroy(comm_handle_j); hypre_ParCSRCommHandleDestroy(comm_handle_a); hypre_TFree(request, HYPRE_MEMORY_HOST); return A_ext; } 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; return B; } HYPRE_Int hypre_ExchangeExternalRowsDeviceInit( 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_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; 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) *--------------------------------------------------------------------------*/ HYPRE_THRUST_CALL(adjacent_difference, B_ext_i_d, B_ext_i_d + B_ext_nrows + 1, B_ext_rownnz_d); 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]]; } comm_pkg_j = hypre_CTAlloc(hypre_ParCSRCommPkg, 1, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgComm(comm_pkg_j) = comm; hypre_ParCSRCommPkgNumSends(comm_pkg_j) = num_recvs; hypre_ParCSRCommPkgNumRecvs(comm_pkg_j) = num_sends; hypre_ParCSRCommPkgSendProcs(comm_pkg_j) = recv_procs; hypre_ParCSRCommPkgRecvProcs(comm_pkg_j) = send_procs; 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); 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]]; } /* note the order of send/recv is reversed */ hypre_ParCSRCommPkgRecvVecStarts(comm_pkg_j) = jdata_send_map_starts; hypre_ParCSRCommPkgSendMapStarts(comm_pkg_j) = jdata_recv_vec_starts; /* send/recv CSR rows */ comm_handle_a = hypre_ParCSRCommHandleCreate_v2( 1, comm_pkg_j, HYPRE_MEMORY_DEVICE, B_ext_a_d, HYPRE_MEMORY_DEVICE, B_int_a_d ); 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(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 ); */ 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); } #endif // #if defined(HYPRE_USING_CUDA) hypre-2.18.2/src/parcsr_mv/par_csr_matop_marked.c000066400000000000000000001453271355566575400220770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "assert.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; 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; HYPRE_Complex *Ps_ext_data; HYPRE_Int *Ps_ext_i; HYPRE_BigInt *Ps_ext_j; HYPRE_Complex *P_ext_diag_data; HYPRE_Int *P_ext_diag_i; HYPRE_Int *P_ext_diag_j; HYPRE_Int P_ext_diag_size; HYPRE_Complex *P_ext_offd_data; 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; } } } 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 (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 ); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C,0); hypre_ParCSRMatrixSetColStartsOwner(C,0); 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; m0 ) { /* just needed for an assertion below... */ for ( j=0; j=0 ); hypre_assert( j-jmin=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=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=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= 0 ) /* Coarse rows only */ { for ( m=C_offd_i[i1]; m=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=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=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 ( i10 ) 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.18.2/src/parcsr_mv/par_csr_matrix.c000066400000000000000000002366311355566575400207370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_Int hypre_FillResponseParToCSRMatrix(void*, HYPRE_Int, HYPRE_Int, void*, MPI_Comm, void**, HYPRE_Int*); #endif /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixCreate *--------------------------------------------------------------------------*/ /* If create is called for HYPRE_NO_GLOBAL_PARTITION and row_starts and col_starts are NOT null, then it is assumed that they are 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_ParCSRMatrix* 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 num_procs, my_id; HYPRE_Int local_num_rows, local_num_cols; 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) { #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_num_rows, num_procs, my_id, &row_starts); #else hypre_GeneratePartitioning(global_num_rows, num_procs, &row_starts); #endif } if (!col_starts) { if (global_num_rows == global_num_cols) { col_starts = row_starts; } else { #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_num_cols, num_procs, my_id, &col_starts); #else hypre_GeneratePartitioning(global_num_cols, num_procs, &col_starts); #endif } } #ifdef HYPRE_NO_GLOBAL_PARTITION /* 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; #else 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; #endif 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_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_ParCSRMatrixColMapOffd(matrix) = NULL; hypre_ParCSRMatrixDeviceColMapOffd(matrix) = NULL; hypre_ParCSRMatrixProcOrdering(matrix) = NULL; hypre_ParCSRMatrixAssumedPartition(matrix) = NULL; hypre_ParCSRMatrixOwnsAssumedPartition(matrix) = 1; /* When NO_GLOBAL_PARTITION is set we could make these null, instead of leaving the range. If that change is made, then when this create is called from functions like the matrix-matrix multiply, be careful not to generate a new partition */ hypre_ParCSRMatrixRowStarts(matrix) = row_starts; hypre_ParCSRMatrixColStarts(matrix) = col_starts; hypre_ParCSRMatrixCommPkg(matrix) = NULL; hypre_ParCSRMatrixCommPkgT(matrix) = NULL; /* set defaults */ hypre_ParCSRMatrixOwnsData(matrix) = 1; hypre_ParCSRMatrixOwnsRowStarts(matrix) = 1; hypre_ParCSRMatrixOwnsColStarts(matrix) = 1; if (row_starts == col_starts) { hypre_ParCSRMatrixOwnsColStarts(matrix) = 0; } hypre_ParCSRMatrixRowindices(matrix) = NULL; hypre_ParCSRMatrixRowvalues(matrix) = NULL; hypre_ParCSRMatrixGetrowactive(matrix) = 0; matrix->bdiaginv = NULL; matrix->bdiaginv_comm_pkg = NULL; matrix->bdiag_size = -1; return matrix; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixDestroy( hypre_ParCSRMatrix *matrix ) { if (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)) { /*ASSERT_HOST(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)); } } if ( hypre_ParCSRMatrixOwnsRowStarts(matrix) ) { hypre_TFree(hypre_ParCSRMatrixRowStarts(matrix), HYPRE_MEMORY_HOST); } if ( hypre_ParCSRMatrixOwnsColStarts(matrix) ) { hypre_TFree(hypre_ParCSRMatrixColStarts(matrix), HYPRE_MEMORY_HOST); } hypre_TFree(hypre_ParCSRMatrixRowindices(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_ParCSRMatrixRowvalues(matrix), HYPRE_MEMORY_HOST); 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); } hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_Int 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_Int hypre_ParCSRMatrixInitialize( hypre_ParCSRMatrix *matrix ) { return hypre_ParCSRMatrixInitialize_v2(matrix, HYPRE_MEMORY_SHARED); } /*-------------------------------------------------------------------------- * 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_Int memory_location) { hypre_ParCSRMatrix *S; 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)) ); /* !!! S does not own Row/Col-Starts */ hypre_ParCSRMatrixSetRowStartsOwner(S, 0); hypre_ParCSRMatrixSetColStartsOwner(S, 0); hypre_ParCSRMatrixNumNonzeros(S) = hypre_ParCSRMatrixNumNonzeros(A); hypre_ParCSRMatrixDNumNonzeros(S) = hypre_ParCSRMatrixNumNonzeros(A); hypre_ParCSRMatrixInitialize_v2(S, memory_location); hypre_ParCSRMatrixCopy(A, S, copy_data); return S; } hypre_ParCSRMatrix* hypre_ParCSRMatrixClone(hypre_ParCSRMatrix *A, HYPRE_Int copy_data) { return hypre_ParCSRMatrixClone_v2(A, copy_data, HYPRE_MEMORY_SHARED); } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetNumNonzeros( hypre_ParCSRMatrix *matrix ) { MPI_Comm comm; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_Int local_num_rows; HYPRE_BigInt total_num_nonzeros; HYPRE_BigInt local_num_nonzeros; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm(matrix); diag = hypre_ParCSRMatrixDiag(matrix); diag_i = hypre_CSRMatrixI(diag); offd = hypre_ParCSRMatrixOffd(matrix); offd_i = hypre_CSRMatrixI(offd); local_num_rows = hypre_CSRMatrixNumRows(diag); 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_ParCSRMatrixNumNonzeros(matrix) = total_num_nonzeros; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetDNumNonzeros *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetDNumNonzeros( hypre_ParCSRMatrix *matrix ) { MPI_Comm comm; hypre_CSRMatrix *diag; HYPRE_Int *diag_i; hypre_CSRMatrix *offd; HYPRE_Int *offd_i; HYPRE_Int local_num_rows; HYPRE_Real total_num_nonzeros; HYPRE_Real local_num_nonzeros; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm(matrix); diag = hypre_ParCSRMatrixDiag(matrix); diag_i = hypre_CSRMatrixI(diag); offd = hypre_ParCSRMatrixOffd(matrix); offd_i = hypre_CSRMatrixI(offd); local_num_rows = hypre_CSRMatrixNumRows(diag); local_num_nonzeros = diag_i[local_num_rows]; local_num_nonzeros += offd_i[local_num_rows]; hypre_MPI_Allreduce(&local_num_nonzeros, &total_num_nonzeros, 1, HYPRE_MPI_REAL, hypre_MPI_SUM, comm); hypre_ParCSRMatrixDNumNonzeros(matrix) = total_num_nonzeros; 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_ParCSRMatrixSetRowStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetRowStartsOwner( hypre_ParCSRMatrix *matrix, HYPRE_Int owns_row_starts ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixOwnsRowStarts(matrix) = owns_row_starts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixSetColStartsOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParCSRMatrixSetColStartsOwner( hypre_ParCSRMatrix *matrix, HYPRE_Int owns_col_starts ) { if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParCSRMatrixOwnsColStarts(matrix) = owns_col_starts; return hypre_error_flag; } /*-------------------------------------------------------------------------- * 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, 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; #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt row_s, row_e, col_s, col_e; #endif hypre_MPI_Comm_rank(comm,&my_id); hypre_MPI_Comm_size(comm,&num_procs); #ifdef HYPRE_NO_GLOBAL_PARTITION row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); #else row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); #endif 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); #ifdef HYPRE_NO_GLOBAL_PARTITION /* the bgl input file should only contain the EXACT range for local processor */ hypre_fscanf(fp, "%d %d %d %d", &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; #else 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; #endif 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); #ifdef HYPRE_NO_GLOBAL_PARTITION for (i=1; i >= 0; i--) { if (row_starts[i] != col_starts[i]) { equal = 0; break; } } #else for (i=num_procs; i >= 0; i--) { if (row_starts[i] != col_starts[i]) { equal = 0; break; } } #endif if (equal) { hypre_TFree(col_starts, HYPRE_MEMORY_HOST); col_starts = row_starts; } 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(offd); } 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; #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_ParCSRMatrixFirstRowIndex(matrix) = row_s; hypre_ParCSRMatrixFirstColDiag(matrix) = col_s; hypre_ParCSRMatrixLastRowIndex(matrix) = row_e - 1; hypre_ParCSRMatrixLastColDiag(matrix) = col_e - 1; #else hypre_ParCSRMatrixFirstRowIndex(matrix) = row_starts[my_id]; hypre_ParCSRMatrixFirstColDiag(matrix) = col_starts[my_id]; hypre_ParCSRMatrixLastRowIndex(matrix) = row_starts[my_id+1]-1; hypre_ParCSRMatrixLastColDiag(matrix) = col_starts[my_id+1]-1; #endif hypre_ParCSRMatrixRowStarts(matrix) = row_starts; hypre_ParCSRMatrixColStarts(matrix) = col_starts; hypre_ParCSRMatrixCommPkg(matrix) = NULL; /* set defaults */ hypre_ParCSRMatrixOwnsData(matrix) = 1; hypre_ParCSRMatrixOwnsRowStarts(matrix) = 1; hypre_ParCSRMatrixOwnsColStarts(matrix) = 1; if (row_starts == col_starts) hypre_ParCSRMatrixOwnsColStarts(matrix) = 0; 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; #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; #endif HYPRE_Int my_id, i, num_procs; char new_file_d[80], new_file_o[80], new_file_info[80]; FILE *fp; HYPRE_Int num_cols_offd = 0; #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt row_s, row_e, col_s, col_e; #endif 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); #ifndef HYPRE_NO_GLOBAL_PARTITION row_starts = hypre_ParCSRMatrixRowStarts(matrix); col_starts = hypre_ParCSRMatrixColStarts(matrix); #endif 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); #ifdef HYPRE_NO_GLOBAL_PARTITION 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); #else for (i=0; i < num_procs; i++) hypre_fprintf(fp, "%b %b\n", row_starts[i], col_starts[i]); #endif 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 ) { 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; HYPRE_BigInt *row_starts; HYPRE_BigInt *col_starts; HYPRE_Complex *diag_data; HYPRE_Int *diag_i; HYPRE_Int *diag_j; HYPRE_Complex *offd_data; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_Int myid, num_procs, i, j; HYPRE_BigInt I, J; char new_filename[255]; FILE *file; HYPRE_Int num_nonzeros_offd; HYPRE_BigInt ilower, iupper, jlower, jupper; if (!matrix) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParCSRMatrixComm(matrix); first_row_index = hypre_ParCSRMatrixFirstRowIndex(matrix); first_col_diag = hypre_ParCSRMatrixFirstColDiag(matrix); diag = hypre_ParCSRMatrixDiag(matrix); offd = hypre_ParCSRMatrixOffd(matrix); col_map_offd = hypre_ParCSRMatrixColMapOffd(matrix); num_rows = hypre_ParCSRMatrixNumRows(matrix); row_starts = hypre_ParCSRMatrixRowStarts(matrix); col_starts = hypre_ParCSRMatrixColStarts(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; } num_nonzeros_offd = hypre_CSRMatrixNumNonzeros(offd); 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); } #ifdef HYPRE_NO_GLOBAL_PARTITION 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; #else ilower = row_starts[myid] +(HYPRE_BigInt)base_i; iupper = row_starts[myid+1]+(HYPRE_BigInt)base_i - 1; jlower = col_starts[myid] +(HYPRE_BigInt)base_j; jupper = col_starts[myid+1]+(HYPRE_BigInt)base_j - 1; #endif 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); 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; HYPRE_BigInt *col_starts; 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; HYPRE_Int *offd_i; HYPRE_Int *offd_j; HYPRE_BigInt *tmp_j; HYPRE_BigInt *aux_offd_j; HYPRE_BigInt I, J; HYPRE_Int myid, num_procs, i, i2, j; char new_filename[255]; FILE *file; HYPRE_Int num_cols_offd, num_nonzeros_diag, num_nonzeros_offd; HYPRE_Int equal, 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); row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i = 0; i <= num_procs; i++) hypre_fscanf(file, "%b %b", &row_starts[i], &col_starts[i]); 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]; equal = 1; for (i = 0; i <= num_procs; i++) { row_starts[i] -= big_base_i; col_starts[i] -= big_base_j; if (row_starts[i] != col_starts[i]) equal = 0; } if (equal) { hypre_TFree(col_starts, HYPRE_MEMORY_HOST); col_starts = row_starts; } 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 ); #ifdef HYPRE_NO_GLOBAL_PARTITION *row_start = hypre_ParCSRMatrixFirstRowIndex(matrix); *row_end = hypre_ParCSRMatrixLastRowIndex(matrix); *col_start = hypre_ParCSRMatrixFirstColDiag(matrix); *col_end = hypre_ParCSRMatrixLastColDiag(matrix); #else *row_start = hypre_ParCSRMatrixRowStarts(matrix)[ my_id ]; *row_end = hypre_ParCSRMatrixRowStarts(matrix)[ my_id + 1 ]-1; *col_start = hypre_ParCSRMatrixColStarts(matrix)[ my_id ]; *col_end = hypre_ParCSRMatrixColStarts(matrix)[ my_id + 1 ]-1; #endif 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_ParCSRMatrixGetRow( 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; #ifdef HYPRE_NO_GLOBAL_PARTITION row_start = hypre_ParCSRMatrixFirstRowIndex(mat); row_end = hypre_ParCSRMatrixLastRowIndex(mat) + 1; #else row_end = hypre_ParCSRMatrixRowStarts(mat)[ my_id + 1 ]; row_start = hypre_ParCSRMatrixRowStarts(mat)[ my_id ]; #endif 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 -1) { for ( i=0; i 3) { hypre_MPI_Bcast(&global_data[3],global_size-3,HYPRE_MPI_BIG_INT,0,comm); if (my_id > 0) { if (global_data[3] < 3) { row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i< num_procs+1; i++) { row_starts[i] = global_data[i+4]; } if (global_data[3] == 0) col_starts = row_starts; if (global_data[3] == 2) { col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i < num_procs+1; i++) { col_starts[i] = global_data[i+num_procs+5]; } } } else { col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); for (i=0; i< num_procs+1; i++) { col_starts[i] = global_data[i+4]; } } } } hypre_TFree(global_data, HYPRE_MEMORY_HOST); 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_ParCSRMatrixCreate( comm, global_num_rows, global_num_cols,row_starts,col_starts,0,0,0); row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); col_starts = hypre_ParCSRMatrixColStarts(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_CSRMatrixCreate(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_BuildCSRMatrixMPIDataType(local_num_nonzeros[i], local_num_rows[i], &a_data[ind], &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_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(local_num_nonzeros, HYPRE_MEMORY_HOST); } else { hypre_CSRMatrixInitialize(local_A); hypre_BuildCSRMatrixMPIDataType(num_nonzeros, local_num_rows[my_id], hypre_CSRMatrixData(local_A), hypre_CSRMatrixI(local_A), hypre_CSRMatrixJ(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; GenerateDiagAndOffd(local_A, par_matrix, 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(local_num_rows, HYPRE_MEMORY_HOST); hypre_TFree(csr_matrix_datatypes, HYPRE_MEMORY_HOST); return par_matrix; } 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); 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; if (num_cols - num_cols_diag) { hypre_CSRMatrixInitialize(diag); diag_i = hypre_CSRMatrixI(diag); hypre_CSRMatrixInitialize(offd); 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_MergeDiagAndOffd(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; num_nonzeros = diag_i[num_rows] + offd_i[num_rows]; matrix = hypre_CSRMatrixCreate(num_rows,num_cols,num_nonzeros); 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_ParCSRMatrixToCSRMatrixAll: * generates a CSRMatrix from a ParCSRMatrix on all processors that have * parts of the ParCSRMatrix * Warning: this only works for a ParCSRMatrix that is smaller than 2^31-1 *--------------------------------------------------------------------------*/ hypre_CSRMatrix * hypre_ParCSRMatrixToCSRMatrixAll(hypre_ParCSRMatrix *par_matrix) { MPI_Comm comm = hypre_ParCSRMatrixComm(par_matrix); hypre_CSRMatrix *matrix; hypre_CSRMatrix *local_matrix; HYPRE_Int num_rows = (HYPRE_Int)hypre_ParCSRMatrixGlobalNumRows(par_matrix); HYPRE_Int num_cols = (HYPRE_Int)hypre_ParCSRMatrixGlobalNumCols(par_matrix); #ifndef HYPRE_NO_GLOBAL_PARTITION HYPRE_BigInt *row_starts = hypre_ParCSRMatrixRowStarts(par_matrix); #endif HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Complex *matrix_data; HYPRE_Int *local_matrix_i; HYPRE_Int *local_matrix_j; HYPRE_Complex *local_matrix_data; HYPRE_Int i, j; HYPRE_Int local_num_rows; HYPRE_Int local_num_nonzeros; 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_MPI_Request *requests; hypre_MPI_Status *status; #ifdef HYPRE_NO_GLOBAL_PARTITION 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 = 11112, tag2 = 22223, tag3 = 33334; HYPRE_Int start; #endif hypre_MPI_Comm_size(comm, &num_procs); hypre_MPI_Comm_rank(comm, &my_id); #ifdef HYPRE_NO_GLOBAL_PARTITION local_num_rows = (HYPRE_Int)(hypre_ParCSRMatrixLastRowIndex(par_matrix) - hypre_ParCSRMatrixFirstRowIndex(par_matrix) + 1); local_matrix = hypre_MergeDiagAndOffd(par_matrix); /* creates matrix */ hypre_CSRMatrixBigJtoJ(local_matrix); /* copies big_j to j */ local_matrix_i = hypre_CSRMatrixI(local_matrix); local_matrix_j = hypre_CSRMatrixJ(local_matrix); local_matrix_data = hypre_CSRMatrixData(local_matrix); /* 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); if(response_recv_buf) hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); if(response_recv_buf_starts) hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); if (hypre_CSRMatrixOwnsData(local_matrix)) hypre_CSRMatrixDestroy(local_matrix); else hypre_TFree(local_matrix, 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_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); if(response_recv_buf) hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); if(response_recv_buf_starts) hypre_TFree(response_recv_buf_starts, HYPRE_MEMORY_HOST); /* now proc 0 can exit if it has no rows */ if (!local_num_rows) { if (hypre_CSRMatrixOwnsData(local_matrix)) hypre_CSRMatrixDestroy(local_matrix); else hypre_TFree(local_matrix, HYPRE_MEMORY_HOST); 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_CSRMatrixMemoryLocation(matrix) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(matrix) = matrix_i; hypre_CSRMatrixInitialize(matrix); 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); #else local_num_rows = (HYPRE_Int)(row_starts[my_id+1] - row_starts[my_id]); /* if my_id contains no data, return NULL */ if (!local_num_rows) return NULL; local_matrix = hypre_MergeDiagAndOffd(par_matrix); hypre_CSRMatrixBigJtoJ(local_matrix); /* copies big_j to j */ local_matrix_i = hypre_CSRMatrixI(local_matrix); local_matrix_j = hypre_CSRMatrixJ(local_matrix); local_matrix_data = hypre_CSRMatrixData(local_matrix); matrix_i = hypre_CTAlloc(HYPRE_Int, num_rows+1, HYPRE_MEMORY_HOST); /* determine procs that have vector data and store their ids in used_procs */ num_types = 0; for (i=0; i < num_procs; i++) if (row_starts[i+1]-row_starts[i] && i-my_id) num_types++; num_requests = 4*num_types; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); j = 0; for (i=0; i < num_procs; i++) if (row_starts[i+1]-row_starts[i] && i-my_id) used_procs[j++] = i; requests = hypre_CTAlloc(hypre_MPI_Request, num_requests, HYPRE_MEMORY_HOST); status = hypre_CTAlloc(hypre_MPI_Status, num_requests, HYPRE_MEMORY_HOST); /* data_type = hypre_CTAlloc(hypre_MPI_Datatype, num_types+1); */ /* exchange contents of local_matrix_i */ j = 0; for (i = 0; i < num_types; i++) { proc_id = used_procs[i]; vec_len = (HYPRE_Int)(row_starts[proc_id+1] - row_starts[proc_id]); hypre_MPI_Irecv(&matrix_i[(HYPRE_Int)row_starts[proc_id]+1], vec_len, HYPRE_MPI_INT, proc_id, 0, 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, 0, comm, &requests[j++]); } vec_len = (HYPRE_Int)(row_starts[my_id+1] - row_starts[my_id]); for (i=1; i <= vec_len; i++) matrix_i[(HYPRE_Int)row_starts[my_id]+i] = local_matrix_i[i]; hypre_MPI_Waitall(j, requests, status); /* generate matrix_i from received data */ offset = matrix_i[(HYPRE_Int)row_starts[1]]; for (i=1; i < num_procs; i++) { for (j = (HYPRE_Int)row_starts[i]; j < (HYPRE_Int)row_starts[i+1]; j++) matrix_i[j+1] += offset; offset = matrix_i[(HYPRE_Int)row_starts[i+1]]; } num_nonzeros = matrix_i[num_rows]; matrix = hypre_CSRMatrixCreate(num_rows, num_cols, num_nonzeros); hypre_CSRMatrixMemoryLocation(matrix) = HYPRE_MEMORY_HOST; hypre_CSRMatrixI(matrix) = matrix_i; hypre_CSRMatrixInitialize(matrix); 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)row_starts[proc_id]]; num_data = matrix_i[(HYPRE_Int)row_starts[proc_id+1]] - start_index; hypre_MPI_Irecv(&matrix_data[start_index], num_data, HYPRE_MPI_COMPLEX, used_procs[i], 0, comm, &requests[j++]); hypre_MPI_Irecv(&matrix_j[start_index], num_data, HYPRE_MPI_INT, used_procs[i], 0, 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], 0, comm, &requests[j++]); hypre_MPI_Isend(local_matrix_j, local_num_nonzeros, HYPRE_MPI_INT, used_procs[i], 0, comm, &requests[j++]); } start_index = matrix_i[(HYPRE_Int)row_starts[my_id]]; for (i=0; i < local_num_nonzeros; i++) { matrix_j[start_index+i] = local_matrix_j[i]; matrix_data[start_index+i] = local_matrix_data[i]; } hypre_MPI_Waitall(num_requests, requests, status); start_index = matrix_i[(HYPRE_Int)row_starts[my_id]]; for (i=0; i < local_num_nonzeros; i++) { matrix_j[start_index+i] = local_matrix_j[i]; matrix_data[start_index+i] = local_matrix_data[i]; } hypre_MPI_Waitall(num_requests, requests, status); #endif if (hypre_CSRMatrixOwnsData(local_matrix)) hypre_CSRMatrixDestroy(local_matrix); else hypre_TFree(local_matrix, 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); } 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_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) *--------------------------------------------------------------------------*/ hypre_ParCSRMatrix * hypre_ParCSRMatrixUnion( hypre_ParCSRMatrix * A, hypre_ParCSRMatrix * B ) { hypre_ParCSRMatrix * C; HYPRE_BigInt * col_map_offd_C = NULL; HYPRE_Int num_procs, my_id, p; MPI_Comm comm = hypre_ParCSRMatrixComm( A ); hypre_MPI_Comm_rank(comm,&my_id); hypre_MPI_Comm_size(comm,&num_procs); 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_ParCSRMatrixRowStarts( C ) = hypre_ParCSRMatrixRowStarts( A ); hypre_ParCSRMatrixOwnsRowStarts( C ) = 0; hypre_ParCSRMatrixColStarts( C ) = hypre_ParCSRMatrixColStarts( A ); hypre_ParCSRMatrixOwnsColStarts( C ) = 0; for ( p=0; p<=num_procs; ++p ) hypre_assert( hypre_ParCSRMatrixColStarts(A) == hypre_ParCSRMatrixColStarts(B) ); 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; } /* 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_ParCSRMatrixDropSmallEntries( 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); if (tol <= 0.0) { return hypre_error_flag; } 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 += fabs(v); } else if (type == 2) { row_nrm += v*v; } else { row_nrm = hypre_max(row_nrm, fabs(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 += fabs(v); } else if (type == 2) { row_nrm += v*v; } else { row_nrm = hypre_max(row_nrm, fabs(v)); } } } if (type == 2) { row_nrm = 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 || fabs(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] || fabs(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; } /* #ifdef HYPRE_USING_UNIFIED_MEMORY hypre_int hypre_ParCSRMatrixIsManaged(hypre_ParCSRMatrix *a){ if (hypre_CSRMatrixNumCols(hypre_ParCSRMatrixOffd(a))) return ((hypre_CSRMatrixIsManaged(hypre_ParCSRMatrixDiag(a))) && (hypre_CSRMatrixIsManaged(hypre_ParCSRMatrixOffd(a)))); else return hypre_CSRMatrixIsManaged(hypre_ParCSRMatrixDiag(a)); } #endif */ hypre-2.18.2/src/parcsr_mv/par_csr_matrix.h000066400000000000000000000217051355566575400207360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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; /* array of length 2 giving the glboal index of the first row on this processor, and 1+index of the final row on this processor. If –enable-global-partition is used, then array is length num_procs+1, and row_starts[i] contains the global number of the first row on proc i, first_row_index = row_starts[my_id], row_starts[num_procs] = global_num_rows */ HYPRE_BigInt *col_starts; /* array of length num_procs+1, col_starts[i] contains the global number of the first column of diag on proc i, first_col_diag = col_starts[my_id], col_starts[num_procs] = global_num_cols */ hypre_ParCSRCommPkg *comm_pkg; hypre_ParCSRCommPkg *comm_pkgT; /* Does the ParCSRMatrix create/destroy `diag', `offd', `col_map_offd'? */ HYPRE_Int owns_data; /* Does the ParCSRMatrix create/destroy `row_starts', `col_starts'? */ HYPRE_Int owns_row_starts; HYPRE_Int owns_col_starts; HYPRE_BigInt num_nonzeros; HYPRE_Real d_num_nonzeros; /* 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; /* only populated if no_global_partition option is used (compile-time option)*/ /* 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; } 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_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_ParCSRMatrixOwnsRowStarts(matrix) ((matrix) -> owns_row_starts) #define hypre_ParCSRMatrixOwnsColStarts(matrix) ((matrix) -> owns_col_starts) #define hypre_ParCSRMatrixNumRows(matrix) \ hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(matrix)) #define hypre_ParCSRMatrixNumCols(matrix) \ hypre_CSRMatrixNumCols(hypre_ParCSRMatrixDiag(matrix)) #define hypre_ParCSRMatrixNumNonzeros(matrix) ((matrix) -> num_nonzeros) #define hypre_ParCSRMatrixDNumNonzeros(matrix) ((matrix) -> d_num_nonzeros) #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_ParCSRMatrixProcOrdering(matrix) ((matrix) -> proc_ordering) /*-------------------------------------------------------------------------- * 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.18.2/src/parcsr_mv/par_csr_matvec.c000066400000000000000000000671161355566575400207120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * hypre_ParCSRMatrixMatvec *--------------------------------------------------------------------------*/ // 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_ParCSRCommHandle **comm_handle; 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_vectors = hypre_VectorNumVectors(x_local); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int ierr = 0; HYPRE_Int num_sends, jv; HYPRE_Int vecstride = hypre_VectorVectorStride( x_local ); HYPRE_Int idxstride = hypre_VectorIndexStride( x_local ); HYPRE_Complex *x_tmp_data, **x_buf_data; HYPRE_Complex *x_local_data = hypre_VectorData(x_local); hypre_HandleCudaComputeStreamSyncPush(hypre_handle, 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 ); } /*--------------------------------------------------------------------- * 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); hypre_assert( num_cols_offd == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, hypre_ParCSRCommPkgNumRecvs(comm_pkg)) ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif HYPRE_Int use_persistent_comm = 0; #ifdef HYPRE_USING_PERSISTENT_COMM use_persistent_comm = num_vectors == 1; // JSP TODO: we can use persistent communication for multi-vectors, // but then we need different communication handles for different // num_vectors. hypre_ParCSRPersistentCommHandle *persistent_comm_handle; #endif if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(1, comm_pkg); #endif } else { comm_handle = hypre_CTAlloc(hypre_ParCSRCommHandle*, num_vectors, HYPRE_MEMORY_HOST); } /* x_tmp */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* for GPU and single vector, alloc persistent memory for x_tmp (in comm_pkg) and reuse */ if (num_vectors == 1) { if (!hypre_ParCSRCommPkgTmpData(comm_pkg)) { hypre_ParCSRCommPkgTmpData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, num_cols_offd, HYPRE_MEMORY_DEVICE); } hypre_VectorData(x_tmp) = hypre_ParCSRCommPkgTmpData(comm_pkg); hypre_SeqVectorSetDataOwner(x_tmp, 0); } #else if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_VectorData(x_tmp) = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(persistent_comm_handle); hypre_SeqVectorSetDataOwner(x_tmp, 0); #endif } #endif hypre_SeqVectorInitialize_v2(x_tmp, HYPRE_MEMORY_DEVICE); x_tmp_data = hypre_VectorData(x_tmp); /* x_buff_data */ x_buf_data = hypre_CTAlloc(HYPRE_Complex*, num_vectors, HYPRE_MEMORY_HOST); for (jv = 0; jv < num_vectors; ++jv) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if (jv == 0) { if (!hypre_ParCSRCommPkgBufData(comm_pkg)) { hypre_ParCSRCommPkgBufData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } x_buf_data[0] = hypre_ParCSRCommPkgBufData(comm_pkg); continue; } #endif if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM x_buf_data[0] = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); continue; #endif } x_buf_data[jv] = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } /* The assert is because the following loop only works for 'column' storage of a multivector. This needs to be fixed to work more generally, at least for 'row' storage. This in turn, means either change CommPkg so num_sends is no.zones*no.vectors (not no.zones) or, less dangerously, put a stride in the logic of CommHandleCreate (stride either from a new arg or a new variable inside CommPkg). Or put the num_vector iteration inside CommHandleCreate (perhaps a new multivector variant of it). */ hypre_assert( idxstride == 1 ); hypre_SeqVectorPrefetch(x_local, HYPRE_MEMORY_DEVICE); /* send_map_elmts on device */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); for (jv = 0; jv < num_vectors; ++jv) { HYPRE_Complex *send_data = (HYPRE_Complex *) x_buf_data[jv]; HYPRE_Complex *locl_data = x_local_data + jv * vecstride; /* if on device, no need to Sync: send_data is on device memory */ #if defined(HYPRE_USING_CUDA) /* pack send data on device */ HYPRE_THRUST_CALL( gather, hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg) + hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), locl_data, send_data ); #elif defined(HYPRE_USING_DEVICE_OPENMP) /* pack send data on device */ HYPRE_Int i; HYPRE_Int *device_send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); HYPRE_Int start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); HYPRE_Int end = hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); #pragma omp target teams distribute parallel for private(i) is_device_ptr(send_data, locl_data, device_send_map_elmts) for (i = start; i < end; i++) { send_data[i] = locl_data[device_send_map_elmts[i]]; } #else HYPRE_Int i; /* pack send data on host */ #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 ++) { send_data[i] = locl_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,i)]; } #endif } #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 /* nonblocking communication starts */ if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleStart(persistent_comm_handle, HYPRE_MEMORY_DEVICE, x_buf_data[0]); #endif } else { for ( jv = 0; jv < num_vectors; ++jv ) { comm_handle[jv] = hypre_ParCSRCommHandleCreate_v2( 1, comm_pkg, HYPRE_MEMORY_DEVICE, x_buf_data[jv], HYPRE_MEMORY_DEVICE, &x_tmp_data[jv*num_cols_offd] ); } } #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 /* nonblocking communication ends */ if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_DEVICE, x_tmp_data); #endif } else { for ( jv = 0; jv < num_vectors; ++jv ) { hypre_ParCSRCommHandleDestroy(comm_handle[jv]); comm_handle[jv] = NULL; } hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); } #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 hypre_SeqVectorDestroy(x_tmp); x_tmp = NULL; if (!use_persistent_comm) { for ( jv = 0; jv < num_vectors; ++jv ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if (jv == 0) { continue; } #endif hypre_TFree(x_buf_data[jv], HYPRE_MEMORY_DEVICE); } hypre_TFree(x_buf_data, HYPRE_MEMORY_HOST); } hypre_HandleCudaComputeStreamSyncPop(hypre_handle); hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif return ierr; } 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_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_ParCSRCommHandle **comm_handle; 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_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_Int num_vectors = hypre_VectorNumVectors(y_local); HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(offd); HYPRE_Int ierr = 0; HYPRE_Int num_sends, jv; HYPRE_Int vecstride = hypre_VectorVectorStride(y_local); HYPRE_Int idxstride = hypre_VectorIndexStride(y_local); HYPRE_Complex *y_tmp_data, **y_buf_data; HYPRE_Complex *y_local_data = hypre_VectorData(y_local); hypre_HandleCudaComputeStreamSyncPush(hypre_handle, 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); } /*--------------------------------------------------------------------- * 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); hypre_assert( num_cols_offd == hypre_ParCSRCommPkgRecvVecStart(comm_pkg, hypre_ParCSRCommPkgNumRecvs(comm_pkg)) ); hypre_assert( hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0) == 0 ); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] -= hypre_MPI_Wtime(); #endif HYPRE_Int use_persistent_comm = 0; #ifdef HYPRE_USING_PERSISTENT_COMM use_persistent_comm = num_vectors == 1; // JSP TODO: we can use persistent communication for multi-vectors, // but then we need different communication handles for different // num_vectors. hypre_ParCSRPersistentCommHandle *persistent_comm_handle; #endif if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM persistent_comm_handle = hypre_ParCSRCommPkgGetPersistentCommHandle(2, comm_pkg); #endif } else { comm_handle = hypre_CTAlloc(hypre_ParCSRCommHandle*, num_vectors, HYPRE_MEMORY_HOST); } /* y_tmp */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* for GPU and single vector, alloc persistent memory for y_tmp (in comm_pkg) and reuse */ if (num_vectors == 1) { if (!hypre_ParCSRCommPkgTmpData(comm_pkg)) { hypre_ParCSRCommPkgTmpData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, num_cols_offd, HYPRE_MEMORY_DEVICE); } hypre_VectorData(y_tmp) = hypre_ParCSRCommPkgTmpData(comm_pkg); hypre_SeqVectorSetDataOwner(y_tmp, 0); } #else if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_VectorData(y_tmp) = (HYPRE_Complex *) hypre_ParCSRCommHandleSendDataBuffer(persistent_comm_handle); hypre_SeqVectorSetDataOwner(y_tmp, 0); #endif } #endif hypre_SeqVectorInitialize_v2(y_tmp, HYPRE_MEMORY_DEVICE); y_tmp_data = hypre_VectorData(y_tmp); /* y_buf_data */ y_buf_data = hypre_CTAlloc(HYPRE_Complex*, num_vectors, HYPRE_MEMORY_HOST); for (jv = 0; jv < num_vectors; ++jv) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if (jv == 0) { if (!hypre_ParCSRCommPkgBufData(comm_pkg)) { hypre_ParCSRCommPkgBufData(comm_pkg) = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } y_buf_data[0] = hypre_ParCSRCommPkgBufData(comm_pkg); continue; } #endif if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM y_buf_data[0] = (HYPRE_Complex *) hypre_ParCSRCommHandleRecvDataBuffer(persistent_comm_handle); continue; #endif } y_buf_data[jv] = hypre_TAlloc(HYPRE_Complex, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), HYPRE_MEMORY_DEVICE); } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif 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 if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleStart(persistent_comm_handle, HYPRE_MEMORY_DEVICE, y_tmp_data); #endif } else { for ( jv = 0; jv < num_vectors; ++jv ) { /* this is where we assume multivectors are 'column' storage */ comm_handle[jv] = hypre_ParCSRCommHandleCreate_v2( 2, comm_pkg, HYPRE_MEMORY_DEVICE, &y_tmp_data[jv*num_cols_offd], HYPRE_MEMORY_DEVICE, y_buf_data[jv] ); } } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_HALO_EXCHANGE] += hypre_MPI_Wtime(); #endif /* overlapped local computation */ 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 /* nonblocking communication ends */ if (use_persistent_comm) { #ifdef HYPRE_USING_PERSISTENT_COMM hypre_ParCSRPersistentCommHandleWait(persistent_comm_handle, HYPRE_MEMORY_DEVICE, y_buf_data[0]); #endif } else { for ( jv = 0; jv < num_vectors; ++jv ) { hypre_ParCSRCommHandleDestroy(comm_handle[jv]); comm_handle[jv] = NULL; } hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); } #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 because the following loop only works for 'column' storage of a multivector. This needs to be fixed to work more generally, at least for 'row' storage. This in turn, means either change CommPkg so num_sends is no.zones*no.vectors (not no.zones) or, less dangerously, put a stride in the logic of CommHandleCreate (stride either from a new arg or a new variable inside CommPkg). Or put the num_vector iteration inside CommHandleCreate (perhaps a new multivector variant of it). */ hypre_assert( idxstride == 1 ); /* send_map_elmts on device */ hypre_ParCSRCommPkgCopySendMapElmtsToDevice(comm_pkg); for (jv = 0; jv < num_vectors; ++jv) { HYPRE_Complex *recv_data = (HYPRE_Complex *) y_buf_data[jv]; HYPRE_Complex *locl_data = y_local_data + jv * vecstride; #if defined(HYPRE_USING_CUDA) /* unpack recv data on device */ hypreDevice_GenScatterAdd(locl_data, hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends), hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg), recv_data); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i, j; /* unpack recv data on device */ for (i = 0; i < num_sends; i++) { HYPRE_Int *device_send_map_elmts = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg); 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(recv_data, locl_data, device_send_map_elmts) for (j = start; j < end; j++) { locl_data[device_send_map_elmts[j]] += recv_data[j]; } } #else HYPRE_Int i; /* unpack recv data on host, TODO OMP? */ for (i = hypre_ParCSRCommPkgSendMapStart(comm_pkg, 0); i < hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends); i ++) { locl_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,i)] += recv_data[i]; } #endif } hypre_SeqVectorDestroy(y_tmp); y_tmp = NULL; if (!use_persistent_comm) { for ( jv = 0; jv < num_vectors; ++jv ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if (jv == 0) { continue; } #endif hypre_TFree(y_buf_data[jv], HYPRE_MEMORY_DEVICE); } hypre_TFree(y_buf_data, HYPRE_MEMORY_HOST); } hypre_HandleCudaComputeStreamSyncPop(hypre_handle); hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_PACK_UNPACK] += hypre_MPI_Wtime(); #endif 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; 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; 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, 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.18.2/src/parcsr_mv/par_csr_triplemat.c000066400000000000000000001012031355566575400214160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_ParCSRMatMat : multiplies two ParCSRMatrices 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_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_CSRMatrixMultiply(A_diag, B_diag); AB_offd = hypre_CSRMatrixMultiply(A_diag, B_offd); /* These require data from other processes */ ABext_diag = hypre_CSRMatrixMultiply(A_offd, Bext_diag); ABext_offd = hypre_CSRMatrixMultiply(A_offd, Bext_offd); hypre_CSRMatrixDestroy(Bext_diag); hypre_CSRMatrixDestroy(Bext_offd); if (num_cols_offd_B) { HYPRE_Int i; 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(AB_diag, ABext_diag); C_offd = hypre_CSRMatrixAdd(AB_offd, ABext_offd); hypre_CSRMatrixDestroy(AB_diag); hypre_CSRMatrixDestroy(ABext_diag); hypre_CSRMatrixDestroy(AB_offd); hypre_CSRMatrixDestroy(ABext_offd); } else { C_diag = hypre_CSRMatrixMultiply(A_diag, B_diag); C_offd = hypre_CSRMatrixCreate(num_rows_diag_A, 0, 0); hypre_CSRMatrixInitialize(C_offd); } /*----------------------------------------------------------------------- * 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); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C,0); hypre_ParCSRMatrixSetColStartsOwner(C,0); 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; } /*----------------------------------------------------------------------- * Free various arrays *-----------------------------------------------------------------------*/ return C; } hypre_ParCSRMatrix* hypre_ParCSRMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B ) { #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); #endif HYPRE_Int exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(A)), hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B)) ); hypre_assert(exec != HYPRE_EXEC_UNSET); hypre_ParCSRMatrix *C = NULL; if (exec == HYPRE_EXEC_HOST) { C = hypre_ParCSRMatMatHost(A,B); } #if defined(HYPRE_USING_CUDA) else { C = hypre_ParCSRMatMatDevice(A,B); } #endif #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif // TODO #if defined(HYPRE_USING_CUDA) if (hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(C))) == HYPRE_MEMORY_DEVICE) { hypre_CSRMatrix *C_diag = hypre_CSRMatrixClone(hypre_ParCSRMatrixDiag(C), 1); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrix *C_offd = hypre_CSRMatrixClone(hypre_ParCSRMatrixOffd(C), 1); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; } #endif return C; } /*-------------------------------------------------------------------------- * hypre_ParCSRTMatMatKT : 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_ParCSRTMatMatKTHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); 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 = NULL; 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;*/ hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); if (num_procs == 1) { C_diag = hypre_CSRMatrixMultiply(AT_diag, B_diag); C_offd = hypre_CSRMatrixCreate(num_cols_diag_A, 0, 0); hypre_CSRMatrixInitialize(C_offd); if (keep_transpose) { A->diagT = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } } else { hypre_CSRMatrix *AT_offd = NULL; 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; hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); 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; /* 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_CSRMatrixMultiply(AT_diag, B_diag); C_tmp_offd = hypre_CSRMatrixMultiply(AT_diag, B_offd); if (keep_transpose) { A->diagT = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } if (keep_transpose) { A->offdT = 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); } 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); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C,0); hypre_ParCSRMatrixSetColStartsOwner(C,0); 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_ParCSRMatrix* hypre_ParCSRTMatMatKT( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); #endif HYPRE_Int exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(A)), hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(B)) ); hypre_assert(exec != HYPRE_EXEC_UNSET); hypre_ParCSRMatrix *C = NULL; if (exec == HYPRE_EXEC_HOST) { C = hypre_ParCSRTMatMatKTHost(A, B, keep_transpose); } #if defined(HYPRE_USING_CUDA) else { C = hypre_ParCSRTMatMatKTDevice(A, B, keep_transpose); } #endif #if defined(HYPRE_USING_CUDA) //hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif #if defined(HYPRE_USING_CUDA) if (hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(hypre_ParCSRMatrixDiag(C))) == HYPRE_MEMORY_DEVICE) { hypre_CSRMatrix *C_diag = hypre_CSRMatrixClone(hypre_ParCSRMatrixDiag(C), 1); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(C)); hypre_ParCSRMatrixDiag(C) = C_diag; hypre_CSRMatrix *C_offd = hypre_CSRMatrixClone(hypre_ParCSRMatrixOffd(C), 1); hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(C)); hypre_ParCSRMatrixOffd(C) = C_offd; } #endif return C; } hypre_ParCSRMatrix* hypre_ParCSRTMatMat( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B) { return hypre_ParCSRTMatMatKT( A, B, 0); } hypre_ParCSRMatrix *hypre_ParCSRMatrixRAPKT( hypre_ParCSRMatrix *R, hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P, HYPRE_Int keep_transpose ) { 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_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_CSRMatrix *P_offd = hypre_ParCSRMatrixOffd(P); HYPRE_BigInt *col_map_offd_P = hypre_ParCSRMatrixColMapOffd(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; hypre_CSRMatrix *APext_offd; hypre_ParCSRCommPkg *comm_pkg_R = hypre_ParCSRMatrixCommPkg(R); hypre_CSRMatrix *R_diag = hypre_ParCSRMatrixDiag(R); hypre_CSRMatrix *RT_diag = NULL; hypre_CSRMatrix *R_offd = hypre_ParCSRMatrixOffd(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_ParCSRMatrix *C; HYPRE_BigInt *col_map_offd_C = NULL; HYPRE_Int *map_Q_to_C; hypre_CSRMatrix *C_diag = NULL; HYPRE_BigInt first_col_diag_C; HYPRE_BigInt last_col_diag_C; hypre_CSRMatrix *C_offd = NULL; HYPRE_Int num_cols_offd_C = 0; HYPRE_Int j_indx; HYPRE_BigInt n_rows_R, n_cols_R; HYPRE_Int num_procs, my_id; HYPRE_BigInt n_rows_A, n_cols_A; HYPRE_BigInt n_rows_P, n_cols_P; HYPRE_Int cnt, i; n_rows_R = hypre_ParCSRMatrixGlobalNumRows(R); n_cols_R = hypre_ParCSRMatrixGlobalNumCols(R); n_rows_A = hypre_ParCSRMatrixGlobalNumRows(A); n_cols_A = hypre_ParCSRMatrixGlobalNumCols(A); n_rows_P = hypre_ParCSRMatrixGlobalNumRows(P); n_cols_P = hypre_ParCSRMatrixGlobalNumCols(P); 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; } /*hypre_CSRMatrixTranspose(R_diag, &RT_diag, 1);*/ if (num_procs > 1) { HYPRE_BigInt last_col_diag_P; hypre_CSRMatrix *RT_offd = NULL; 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_CSRMatrixMultiply(A_offd, Pext_diag); APext_offd = hypre_CSRMatrixMultiply(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_CSRMatrixMultiply(A_diag, P_diag); if (num_cols_offd_P) { HYPRE_Int i; AP_offd = hypre_CSRMatrixMultiply(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(AP_diag, 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(AP_offd, 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); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(Q,0); hypre_ParCSRMatrixSetColStartsOwner(Q,0); 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; hypre_CSRMatrixTranspose(R_diag, &RT_diag, 1); C_tmp_diag = hypre_CSRMatrixMultiply(RT_diag, Q_diag); if (num_cols_offd_Q) { C_tmp_offd = hypre_CSRMatrixMultiply(RT_diag, Q_offd); /* RL: WHY NEED THIS? if (C_tmp_offd->num_nonzeros == 0) { C_tmp_offd->num_cols = 0; } */ } else { C_tmp_offd = hypre_CSRMatrixClone(Q_offd, 1); hypre_CSRMatrixNumRows(C_tmp_offd) = num_cols_diag_R; } if (keep_transpose) { R->diagT = RT_diag; } else { hypre_CSRMatrixDestroy(RT_diag); } if (num_cols_offd_R) { hypre_CSRMatrixTranspose(R_offd, &RT_offd, 1); C_int_diag = hypre_CSRMatrixMultiply(RT_offd, Q_diag); C_int_offd = hypre_CSRMatrixMultiply(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 (keep_transpose) { R->offdT = 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_CSRMatrixMultiply(A_diag, P_diag); hypre_CSRMatrixTranspose(R_diag, &RT_diag, 1); C_diag = hypre_CSRMatrixMultiply(RT_diag, Q_diag); C_offd = hypre_CSRMatrixCreate(num_cols_diag_R, 0, 0); hypre_CSRMatrixInitialize(C_offd); if (keep_transpose) { R->diagT = RT_diag; } else { hypre_CSRMatrixDestroy(RT_diag); } hypre_CSRMatrixDestroy(Q_diag); } C = hypre_ParCSRMatrixCreate(comm, n_cols_R, n_cols_P, col_starts_R, col_starts_P, num_cols_offd_C, 0, 0); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetColStartsOwner(P,0); hypre_ParCSRMatrixSetColStartsOwner(R,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_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.18.2/src/parcsr_mv/par_csr_triplemat_device.c000066400000000000000000000366711355566575400227550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #if defined(HYPRE_USING_CUDA) hypre_ParCSRMatrix* hypre_ParCSRMatMatDevice( 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 *Bext; 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 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; } 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; /*----------------------------------------------------------------------- * 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; /*--------------------------------------------------------------------- * If there exists no CommPkg for A, a CommPkg is generated using * equally load balanced partitionings within * hypre_ParCSRMatrixExtractBExt *--------------------------------------------------------------------*/ /* contains communication which should be explicitly included to allow for overlap */ hypre_ParCSRMatrixExtractBExtDeviceInit(B, A, 1, &request); //Bext = hypre_ParCSRMatrixExtractBExtDeviceWait(request); /* These are local and could be overlapped with communication */ AB_diag = hypre_CSRMatrixMultiply(A_diag, B_diag); AB_offd = hypre_CSRMatrixMultiply(A_diag, B_offd); Bext = hypre_ParCSRMatrixExtractBExtDeviceWait(request); hypre_CSRMatrixSplitDevice(Bext, first_col_diag_B, last_col_diag_B, num_cols_offd_B, hypre_ParCSRMatrixDeviceColMapOffd(B), &map_B_to_C, &num_cols_offd_C, &col_map_offd_C, &Bext_diag, &Bext_offd); hypre_CSRMatrixDestroy(Bext); /* if (my_id == 3) { printf("%d\n", num_cols_offd_C); HYPRE_Int *host_col_map_offd_C = hypre_TAlloc(HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_HOST); hypre_TMemcpy(host_col_map_offd_C, col_map_offd_C, HYPRE_Int, num_cols_offd_C, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); for (i=0; inum_nonzeros, C_offd->num_nonzeros); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C, 0); hypre_ParCSRMatrixSetColStartsOwner(C, 0); 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_ParCSRMatrixColMapOffd(C) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(C), col_map_offd_C, HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } return C; } hypre_ParCSRMatrix* hypre_ParCSRTMatMatKTDevice( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *B, HYPRE_Int keep_transpose) { MPI_Comm comm = hypre_ParCSRMatrixComm(A); hypre_ParCSRCommPkg *comm_pkg_A = hypre_ParCSRMatrixCommPkg(A); 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 = NULL; 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 last_col_diag_B = first_col_diag_B + num_cols_diag_B - 1; /* 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_Int first_col_diag_C; HYPRE_Int 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 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;*/ hypre_CSRMatrixTranspose(A_diag, &AT_diag, 1); if (num_procs == 1) { C_diag = hypre_CSRMatrixMultiply(AT_diag, B_diag); C_offd = hypre_CSRMatrixCreate(num_cols_diag_A, 0, 0); hypre_CSRMatrixInitialize_v2(C_offd, 0, HYPRE_MEMORY_DEVICE); if (keep_transpose) { A->diagT = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } } else { hypre_CSRMatrix *AT_offd; hypre_CSRMatrix *C_int; hypre_CSRMatrix *C_int_diag; hypre_CSRMatrix *C_int_offd; hypre_CSRMatrix *C_ext; hypre_CSRMatrix *C_ext_diag; hypre_CSRMatrix *C_ext_offd; hypre_CSRMatrix *C_tmp_diag; hypre_CSRMatrix *C_tmp_offd; HYPRE_Int *C_tmp_offd_j; HYPRE_Int num_sends_A; HYPRE_Int num_elmts_send_A; HYPRE_Int *h_send_map_elmts_A; HYPRE_Int *d_send_map_elmts_A; void *request; hypre_CSRMatrixTranspose(A_offd, &AT_offd, 1); /* Remark: do not do merge B first and then multiply. * A merged B with global column range has difficulty in GPU spmm rowest */ 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_MergeDiagAndOffdDevice(B); hypre_ParCSRMatrixDiag(B) = B_diag; hypre_ParCSRMatrixOffd(B) = B_offd; hypre_ExchangeExternalRowsDeviceInit(C_int, comm_pkg_A, &request); //C_ext = hypre_ExchangeExternalRowsDeviceWait(request); hypre_CSRMatrixDestroy(C_int_diag); hypre_CSRMatrixDestroy(C_int_offd); C_tmp_diag = hypre_CSRMatrixMultiply(AT_diag, B_diag); C_tmp_offd = hypre_CSRMatrixMultiply(AT_diag, B_offd); if (keep_transpose) { A->diagT = AT_diag; } else { hypre_CSRMatrixDestroy(AT_diag); } if (keep_transpose) { A->offdT = AT_offd; } else { hypre_CSRMatrixDestroy(AT_offd); } C_ext = hypre_ExchangeExternalRowsDeviceWait(request); hypre_CSRMatrixDestroy(C_int); hypre_CSRMatrixSplitDevice(C_ext, first_col_diag_B, last_col_diag_B, num_cols_offd_B, hypre_ParCSRMatrixDeviceColMapOffd(B), &map_B_to_C, &num_cols_offd_C, &col_map_offd_C, &C_ext_diag, &C_ext_offd); hypre_CSRMatrixDestroy(C_ext); /* adjust C_tmp_offd cols indices and number of cols of this matrix * NOTE: cannot adjust the cols of B_offd (which needs less work) beforehand, unless want to change B */ C_tmp_offd_j = hypre_CSRMatrixJ(C_tmp_offd); HYPRE_THRUST_CALL(gather, C_tmp_offd_j, C_tmp_offd_j + hypre_CSRMatrixNumNonzeros(C_tmp_offd), map_B_to_C, C_tmp_offd_j); hypre_TFree(map_B_to_C, HYPRE_MEMORY_DEVICE); hypre_CSRMatrixNumCols(C_tmp_offd) = num_cols_offd_C; /* add two parts together: a more general add, repeated rows */ num_sends_A = hypre_ParCSRCommPkgNumSends(comm_pkg_A); num_elmts_send_A = hypre_ParCSRCommPkgSendMapStart(comm_pkg_A, num_sends_A); h_send_map_elmts_A = hypre_ParCSRCommPkgSendMapElmts(comm_pkg_A); d_send_map_elmts_A = hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_A); if (d_send_map_elmts_A == NULL) { d_send_map_elmts_A = hypre_TAlloc(HYPRE_Int, num_elmts_send_A, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_send_map_elmts_A, h_send_map_elmts_A, HYPRE_Int, num_elmts_send_A, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_ParCSRCommPkgDeviceSendMapElmts(comm_pkg_A) = d_send_map_elmts_A; } hypre_assert(hypre_CSRMatrixNumRows(C_ext_diag) == num_elmts_send_A); hypre_assert(hypre_CSRMatrixNumRows(C_ext_offd) == num_elmts_send_A); C_diag = hypre_CSRMatrixAddPartialDevice(C_tmp_diag, C_ext_diag, d_send_map_elmts_A); C_offd = hypre_CSRMatrixAddPartialDevice(C_tmp_offd, C_ext_offd, d_send_map_elmts_A); hypre_CSRMatrixDestroy(C_tmp_diag); hypre_CSRMatrixDestroy(C_tmp_offd); hypre_CSRMatrixDestroy(C_ext_diag); hypre_CSRMatrixDestroy(C_ext_offd); } 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); /* Note that C does not own the partitionings */ hypre_ParCSRMatrixSetRowStartsOwner(C, 0); hypre_ParCSRMatrixSetColStartsOwner(C, 0); 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_ParCSRMatrixColMapOffd(C) = hypre_TAlloc(HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST); hypre_TMemcpy(hypre_ParCSRMatrixColMapOffd(C), col_map_offd_C, HYPRE_BigInt, num_cols_offd_C, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } /* Move the diagonal entry to the first of each row */ hypre_CSRMatrixMoveDiagFirstDevice(C_diag); return C; } #endif // #if defined(HYPRE_USING_CUDA) hypre-2.18.2/src/parcsr_mv/par_make_system.c000066400000000000000000000376311355566575400211040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; HYPRE_BigInt *A_col_starts; 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION A_row_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); A_col_starts = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; } #else A_row_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); A_col_starts = hypre_CTAlloc(HYPRE_BigInt, num_procs + 1, HYPRE_MEMORY_HOST); for(i = 0; i < num_procs + 1; i++) { A_row_starts[i] = L_row_starts[i]*(HYPRE_BigInt)dim; A_col_starts[i] = L_row_starts[i]*(HYPRE_BigInt)dim; } #endif /***** 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_ParVectorSetPartitioningOwner(b, 0); 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_ParVectorSetPartitioningOwner(x, 0); 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 0; } hypre-2.18.2/src/parcsr_mv/par_make_system.h000066400000000000000000000011111355566575400210710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/parcsr_mv/par_vector.c000066400000000000000000001213061355566575400200560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include #ifdef HYPRE_NO_GLOBAL_PARTITION HYPRE_Int hypre_FillResponseParToVectorAll(void*, HYPRE_Int, HYPRE_Int, void*, MPI_Comm, void**, HYPRE_Int*); #endif /*-------------------------------------------------------------------------- * hypre_ParVectorCreate *--------------------------------------------------------------------------*/ /* If create is called for HYPRE_NO_GLOBAL_PARTITION 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 ) { hypre_ParVector *vector; HYPRE_Int num_procs, my_id; 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) { hypre_MPI_Comm_size(comm,&num_procs); #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_GenerateLocalPartitioning(global_size, num_procs, my_id, &partitioning); #else hypre_GeneratePartitioning(global_size, num_procs, &partitioning); #endif } hypre_ParVectorAssumedPartition(vector) = NULL; hypre_ParVectorComm(vector) = comm; hypre_ParVectorGlobalSize(vector) = global_size; #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_ParVectorFirstIndex(vector) = partitioning[0]; hypre_ParVectorLastIndex(vector) = partitioning[1]-1; hypre_ParVectorPartitioning(vector) = partitioning; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(partitioning[1]-partitioning[0]); #else hypre_ParVectorFirstIndex(vector) = partitioning[my_id]; hypre_ParVectorLastIndex(vector) = partitioning[my_id+1] -1; hypre_ParVectorPartitioning(vector) = partitioning; hypre_ParVectorLocalVector(vector) = hypre_SeqVectorCreate(partitioning[my_id+1]-partitioning[my_id]); #endif /* set defaults */ hypre_ParVectorOwnsData(vector) = 1; hypre_ParVectorOwnsPartitioning(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_ParVectorOwnsPartitioning(vector) ) { hypre_TFree(hypre_ParVectorPartitioning(vector), HYPRE_MEMORY_HOST); } if (hypre_ParVectorAssumedPartition(vector)) { hypre_AssumedPartitionDestroy(hypre_ParVectorAssumedPartition(vector)); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_ParVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorInitialize( hypre_ParVector *vector ) { if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_SeqVectorInitialize(hypre_ParVectorLocalVector(vector)); hypre_ParVectorActualLocalSize(vector) = hypre_VectorSize(hypre_ParVectorLocalVector(vector)); 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_ParVectorSetPartitioningOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorSetPartitioningOwner( hypre_ParVector *vector, HYPRE_Int owns_partitioning ) { if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } hypre_ParVectorOwnsPartitioning(vector) = owns_partitioning; 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_ParVectorRead *--------------------------------------------------------------------------*/ hypre_ParVector *hypre_ParVectorRead( MPI_Comm comm, const char *file_name ) { char new_file_name[80]; hypre_ParVector *par_vector; HYPRE_Int my_id, num_procs; HYPRE_BigInt *partitioning; HYPRE_BigInt global_size; HYPRE_Int i; FILE *fp; hypre_MPI_Comm_rank(comm,&my_id); hypre_MPI_Comm_size(comm,&num_procs); partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); 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); #ifdef HYPRE_NO_GLOBAL_PARTITION for (i=0; i < 2; i++) hypre_fscanf(fp, "%b\n", &partitioning[i]); fclose (fp); #else for (i=0; i < num_procs; i++) hypre_fscanf(fp, "%b\n", &partitioning[i]); fclose (fp); partitioning[num_procs] = global_size; #endif par_vector = hypre_CTAlloc(hypre_ParVector, 1, HYPRE_MEMORY_HOST); hypre_ParVectorComm(par_vector) = comm; hypre_ParVectorGlobalSize(par_vector) = global_size; #ifdef HYPRE_NO_GLOBAL_PARTITION hypre_ParVectorFirstIndex(par_vector) = partitioning[0]; hypre_ParVectorLastIndex(par_vector) = partitioning[1]-1; #else hypre_ParVectorFirstIndex(par_vector) = partitioning[my_id]; hypre_ParVectorLastIndex(par_vector) = partitioning[my_id+1]-1; #endif hypre_ParVectorPartitioning(par_vector) = partitioning; hypre_ParVectorOwnsData(par_vector) = 1; hypre_ParVectorOwnsPartitioning(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[80]; hypre_Vector *local_vector; MPI_Comm comm; HYPRE_Int my_id, num_procs, i; 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_MPI_Comm_size(comm,&num_procs); 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); #ifdef HYPRE_NO_GLOBAL_PARTITION for (i=0; i < 2; i++) hypre_fprintf(fp, "%b\n", partitioning[i]); #else for (i=0; i < num_procs; i++) hypre_fprintf(fp, "%b\n", partitioning[i]); #endif 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_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_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_ParVectorOwnsPartitioning(y) = 0; hypre_SeqVectorDestroy( hypre_ParVectorLocalVector(y) ); hypre_ParVectorLocalVector(y) = hypre_SeqVectorCloneShallow( hypre_ParVectorLocalVector(x) ); hypre_ParVectorFirstIndex(y) = hypre_ParVectorFirstIndex(x); return y; } /*-------------------------------------------------------------------------- * 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_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_SHARED); 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_SHARED); return hypre_error_flag; } /*-------------------------------------------------------------------------- * 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_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_SHARED); for (i=0; i < k; i++) y_local[i] = (hypre_Vector *) hypre_ParVectorLocalVector(y[i]); local_result = hypre_CTAlloc(HYPRE_Real, k, HYPRE_MEMORY_SHARED); 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_SHARED); hypre_TFree(local_result, HYPRE_MEMORY_SHARED); 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_SHARED); 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_SHARED); result = hypre_CTAlloc(HYPRE_Real, 2*k, HYPRE_MEMORY_SHARED); 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_SHARED); hypre_TFree(local_result, HYPRE_MEMORY_SHARED); hypre_TFree(result, HYPRE_MEMORY_SHARED); return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_VectorToParVector: * generates a ParVector from a Vector on proc 0 and distributes the pieces * to the other procs in comm * * this is not being optimized to use HYPRE_NO_GLOBAL_PARTITION *--------------------------------------------------------------------------*/ hypre_ParVector * hypre_VectorToParVector ( MPI_Comm comm, hypre_Vector *v, HYPRE_BigInt *vec_starts ) { HYPRE_BigInt global_size; 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; 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_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); local_size = (HYPRE_Int)(vec_starts[my_id+1] - vec_starts[my_id]); 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 0) { num_contacts = 1; contact_proc_list[0] = 0; contact_send_buf[0] = hypre_ParVectorLastIndex(par_v); 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); if(response_recv_buf) hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); if(response_recv_buf_starts) 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); if(response_recv_buf) hypre_TFree(response_recv_buf, HYPRE_MEMORY_HOST); if(response_recv_buf_starts) 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(vector); 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++) { proc_id = used_procs[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, proc_id, 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); if (num_requests) { 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); #else local_size = (HYPRE_Int)(vec_starts[my_id+1] - vec_starts[my_id]); /* if my_id contains no data, return NULL */ if (!local_size) return NULL; local_data = hypre_VectorData(local_vector); vector = hypre_SeqVectorCreate(global_size); hypre_VectorNumVectors(vector) = num_vectors; hypre_SeqVectorInitialize(vector); vector_data = hypre_VectorData(vector); /* determine procs which hold data of par_v and store ids in used_procs */ num_types = -1; for (i=0; i < num_procs; i++) if (vec_starts[i+1]-vec_starts[i]) num_types++; num_requests = 2*num_types; used_procs = hypre_CTAlloc(HYPRE_Int, num_types, HYPRE_MEMORY_HOST); j = 0; for (i=0; i < num_procs; i++) if (vec_starts[i+1]-vec_starts[i] && i-my_id) used_procs[j++] = i; 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 */ j = 0; for (i = 0; i < num_types; i++) { proc_id = used_procs[i]; vec_len = (HYPRE_Int)(vec_starts[proc_id+1] - vec_starts[proc_id]); hypre_MPI_Irecv(&vector_data[vec_starts[proc_id]], num_vectors*vec_len, HYPRE_MPI_COMPLEX, proc_id, 0, 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], 0, comm, &requests[j++]); } for (i=0; i < num_vectors*local_size; i++) vector_data[vec_starts[my_id]+i] = local_data[i]; hypre_MPI_Waitall(num_requests, requests, status); if (num_requests) { hypre_TFree(used_procs, HYPRE_MEMORY_HOST); hypre_TFree(requests, HYPRE_MEMORY_HOST); hypre_TFree(status, HYPRE_MEMORY_HOST); } #endif return vector; } /*-------------------------------------------------------------------------- * hypre_ParVectorPrintIJ *--------------------------------------------------------------------------*/ HYPRE_Int hypre_ParVectorPrintIJ( hypre_ParVector *vector, HYPRE_Int base_j, const char *filename ) { MPI_Comm comm; HYPRE_BigInt global_size, j; HYPRE_BigInt *partitioning; HYPRE_Complex *local_data; HYPRE_Int myid, num_procs, i, part0; char new_filename[255]; FILE *file; if (!vector) { hypre_error_in_arg(1); return hypre_error_flag; } comm = hypre_ParVectorComm(vector); global_size = hypre_ParVectorGlobalSize(vector); partitioning = hypre_ParVectorPartitioning(vector); /* multivector code not written yet */ hypre_assert( hypre_ParVectorNumVectors(vector) == 1 ); if ( hypre_ParVectorNumVectors(vector) != 1 ) hypre_error_in_arg(1); 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; } local_data = hypre_VectorData(hypre_ParVectorLocalVector(vector)); hypre_fprintf(file, "%b \n", global_size); #ifdef HYPRE_NO_GLOBAL_PARTITION for (i=0; i < 2; i++) { hypre_fprintf(file, "%b ", partitioning[i] + base_j); } #else for (i=0; i <= num_procs; i++) { hypre_fprintf(file, "%b ", partitioning[i] + base_j); } #endif hypre_fprintf(file, "\n"); #ifdef HYPRE_NO_GLOBAL_PARTITION part0 = partitioning[0]; for (j = part0; j < partitioning[1]; j++) { hypre_fprintf(file, "%b %.14e\n", j + base_j, local_data[(HYPRE_Int)(j-part0)]); } #else part0 = partitioning[myid]; for (j = part0; j < partitioning[myid+1]; j++) { hypre_fprintf(file, "%b %.14e\n", j + base_j, local_data[(HYPRE_Int)(j-part0)]); } #endif fclose(file); 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 *partitioning; HYPRE_Int base_j; HYPRE_Int myid, num_procs, i, j; char new_filename[255]; 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; } hypre_fscanf(file, "%b", &global_size); #ifdef HYPRE_NO_GLOBAL_PARTITION /* this may need to be changed so that the base is available in the file! */ partitioning = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); hypre_fscanf(file, "%b", partitioning); for (i = 0; i < 2; i++) { hypre_fscanf(file, "%b", partitioning+i); } /* This is not yet implemented correctly! */ base_j = 0; #else partitioning = hypre_CTAlloc(HYPRE_BigInt, num_procs+1, HYPRE_MEMORY_HOST); hypre_fscanf(file, "%b", partitioning); for (i = 1; i <= num_procs; i++) { hypre_fscanf(file, "%b", partitioning+i); partitioning[i] -= partitioning[0]; } base_j = (HYPRE_Int)partitioning[0]; partitioning[0] = 0; #endif vector = hypre_ParVectorCreate(comm, global_size, partitioning); hypre_ParVectorInitialize(vector); local_vector = hypre_ParVectorLocalVector(vector); local_data = hypre_VectorData(local_vector); #ifdef HYPRE_NO_GLOBAL_PARTITION for (j = 0; j < (HYPRE_Int)(partitioning[1] - partitioning[0]); j++) { hypre_fscanf(file, "%b %le", &J, local_data + j); } #else for (j = 0; j < (HYPRE_Int)(partitioning[myid+1] - partitioning[myid]); j++) { hypre_fscanf(file, "%b %le", &J, local_data + j); } #endif 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_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; } /* ----------------------------------------------------------------------------- * return the sum of all local elements of the vector * ----------------------------------------------------------------------------- */ HYPRE_Complex hypre_ParVectorLocalSumElts( hypre_ParVector * vector ) { return hypre_SeqVectorSumElts( hypre_ParVectorLocalVector(vector) ); } /* #ifdef HYPRE_USING_UNIFIED_MEMORY hypre_int hypre_ParVectorIsManaged(hypre_ParVector *vector){ if (vector==NULL) return 1; return hypre_SeqVectorIsManaged(hypre_ParVectorLocalVector(vector)); } #endif */ HYPRE_Int hypre_ParVectorGetValues(hypre_ParVector *vector, HYPRE_Int num_values, HYPRE_BigInt *indices, HYPRE_Complex *values) { HYPRE_Int i, j; HYPRE_BigInt first_index, last_index, index; hypre_Vector *local_vector; HYPRE_Complex *data; first_index = hypre_ParVectorFirstIndex(vector); last_index = hypre_ParVectorLastIndex(vector); local_vector = hypre_ParVectorLocalVector(vector); data = hypre_VectorData(local_vector); if (hypre_VectorOwnsData(local_vector) == 0) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Vector does not own data! -- hypre_ParVectorGetValues."); return hypre_error_flag; } if (indices) { for (i=0; i < num_values; i++) { index = indices[i]; if (index < first_index || index > last_index) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Index out of range! -- hypre_ParVectorGetValues."); return hypre_error_flag; } } #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i,j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) { i = (HYPRE_Int)(indices[j] - first_index); values[j] = data[i]; } } 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(j) HYPRE_SMP_SCHEDULE #endif for (j = 0; j < num_values; j++) values[j] = data[j]; } return hypre_error_flag; } hypre-2.18.2/src/parcsr_mv/par_vector.h000066400000000000000000000054071355566575400200660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; HYPRE_Int actual_local_size; /* stores actual length of data in local vector to allow memory manipulations for temporary vectors*/ hypre_Vector *local_vector; /* Does the Vector create/destroy `data'? */ HYPRE_Int owns_data; HYPRE_Int owns_partitioning; hypre_IJAssumedPart *assumed_partition; /* only populated if no_global_partition option is used (compile-time option) AND 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_ParVectorLocalVector(vector) ((vector) -> local_vector) #define hypre_ParVectorOwnsData(vector) ((vector) -> owns_data) #define hypre_ParVectorOwnsPartitioning(vector) ((vector) -> owns_partitioning) #define hypre_ParVectorNumVectors(vector)\ (hypre_VectorNumVectors( hypre_ParVectorLocalVector(vector) )) #define hypre_ParVectorAssumedPartition(vector) ((vector) -> assumed_partition) #endif hypre-2.18.2/src/parcsr_mv/parchord_to_parcsr.c000066400000000000000000000704041355566575400215720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #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; p0 ) hypre_MPI_Recv( lastlens, 2, HYPRE_MPI_INT, my_id-1, 0, comm, status ); if ( my_id0 ) 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_INT, hypre_MPI_MIN, comm ); hypre_MPI_Allreduce( &max_rdof, &global_max_rdof, 1, HYPRE_MPI_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= row_starts[p] && j_global= row_starts[p] && j_global 0 && hypre_CSRMatrixNumCols(offd) > 0 ) first_index_rdof[my_id] = col_starts[my_id]=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=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= row_starts[pto] && j_global=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>> to set... hypre_ParChordMatrixNumIdofsInprocessor(Ac) (low priority - not used); hypre_ParChordMatrixIdofInprocessor(Ac) (low priority - not used); */ return 0; } hypre-2.18.2/src/seq_mv/000077500000000000000000000000001355566575400150415ustar00rootroot00000000000000hypre-2.18.2/src/seq_mv/CMakeLists.txt000066400000000000000000000012251355566575400176010ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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_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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/seq_mv/HYPRE_csr_matrix.c000066400000000000000000000106731355566575400203360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMethod( HYPRE_Int value ) { #if defined(HYPRE_USING_CUDA) if (hypre_handle == NULL) { return -1; } if (value == 1 || value == 2 || value == 3) { hypre_handle->spgemm_rownnz_estimate_method = value; } else { return -1; } #endif return 0; } HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateNSamples( HYPRE_Int value ) { #if defined(HYPRE_USING_CUDA) if (hypre_handle == NULL) { return -1; } hypre_handle->spgemm_rownnz_estimate_nsamples = value; #endif return 0; } HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMultFactor( HYPRE_Real value ) { #if defined(HYPRE_USING_CUDA) if (hypre_handle == NULL) { return -1; } if (value > 0.0) { hypre_handle->spgemm_rownnz_estimate_mult_factor = value; } else { return -1; } #endif return 0; } HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetHashType( char value ) { #if defined(HYPRE_USING_CUDA) if (hypre_handle == NULL) { return -1; } if (value == 'L' || value == 'Q' || value == 'D') { hypre_handle->spgemm_hash_type = value; } #endif return 0; } HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetUseCusparse( HYPRE_Int value ) { #if defined(HYPRE_USING_CUDA) if (hypre_handle == NULL) { return -1; } hypre_handle->spgemm_use_cusparse = value != 0; #endif return 0; } hypre-2.18.2/src/seq_mv/HYPRE_mapped_matrix.c000066400000000000000000000110731355566575400210100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( ) { 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.18.2/src/seq_mv/HYPRE_multiblock_matrix.c000066400000000000000000000075041355566575400217130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( ) { 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.18.2/src/seq_mv/HYPRE_seq_mv.h000066400000000000000000000127631355566575400174640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; #ifndef HYPRE_VECTOR_STRUCT #define HYPRE_VECTOR_STRUCT struct hypre_Vector_struct; typedef struct hypre_Vector_struct *HYPRE_Vector; #endif /*-------------------------------------------------------------------------- * 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 ); HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMethod( HYPRE_Int value ); HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateNSamples( HYPRE_Int value ); HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMultFactor( HYPRE_Real value ); HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetHashType( char value ); HYPRE_Int HYPRE_CSRMatrixDeviceSpGemmSetUseCusparse( HYPRE_Int value ); 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_SPMM_ROWNNZ, HYPRE_TIMER_ID_SPMM_ATTEMPT1, HYPRE_TIMER_ID_SPMM_ATTEMPT2, HYPRE_TIMER_ID_SPMM_SYMBOLIC, HYPRE_TIMER_ID_SPMM_NUMERIC, HYPRE_TIMER_ID_SPMM, 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.18.2/src/seq_mv/HYPRE_vector.c000066400000000000000000000041621355566575400174610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/seq_mv/MakeIRIX000066400000000000000000000027511355566575400163420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/seq_mv/Makefile000066400000000000000000000042141355566575400165020ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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} CU_COMPILE_FLAGS = ${C_COMPILE_FLAGS} HEADERS =\ csr_matrix.h\ HYPRE_seq_mv.h\ mapped_matrix.h\ multiblock_matrix.h\ seq_mv.h\ vector.h FILES =\ csr_matop.c\ csr_matop_device.c\ csr_matrix.c\ csr_matvec.c\ csr_matvec_oomp.c\ csr_spadd_device.c\ csr_spgemm_device.c\ csr_spgemm_device_attempt.c\ csr_spgemm_device_confident.c\ csr_spgemm_device_cusparse.c\ csr_spgemm_device_rowbound.c\ csr_spgemm_device_rowest.c\ csr_spgemm_device_util.c\ csr_sptrans_device.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 OBJS = ${FILES:.c=.o} #CUOBJS = ${FILES_NVCC:.cu=.o} SONAME = libHYPRE_seq_mv-${HYPRE_RELEASE_VERSION}${HYPRE_LIB_SUFFIX} ################################################################## # Targets ################################################################## all: 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: rm -f *.o libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_seq_mv.a: ${OBJS} ${CUOBJS} @echo "Building $@ ... " ${AR} $@ ${OBJS} ${RANLIB} $@ libHYPRE_seq_mv.so libHYPRE_seq_mv.dylib: ${OBJS} ${CUOBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/seq_mv/csr_matop.c000066400000000000000000001057341355566575400172060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include "seq_mv.h" #include "csr_matrix.h" /*-------------------------------------------------------------------------- * 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_CSRMatrix* hypre_CSRMatrixAddHost ( 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 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; HYPRE_Int *marker; if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Warning! incompatible matrix dimensions!\n"); return NULL; } marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A+1, HYPRE_MEMORY_SHARED); 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_CSRMatrixCreate(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; 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); return C; } hypre_CSRMatrix* hypre_CSRMatrixAdd( hypre_CSRMatrix *A, hypre_CSRMatrix *B) { HYPRE_Int exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(A), hypre_CSRMatrixMemoryLocation(B) ); hypre_assert(exec != HYPRE_EXEC_UNSET); hypre_CSRMatrix *C = NULL; if (exec == HYPRE_EXEC_HOST) { C = hypre_CSRMatrixAddHost(A,B); } #if defined(HYPRE_USING_CUDA) else { C = hypre_CSRMatrixAddDevice(A,B); } #endif return C; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigAdd: * 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_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 ia, ib, ic, num_nonzeros; HYPRE_BigInt jcol; HYPRE_Int pos; HYPRE_Int *marker; if (nrows_A != nrows_B || ncols_A != ncols_B) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"Warning! incompatible matrix dimensions!\n"); return NULL; } marker = hypre_CTAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_HOST); C_i = hypre_CTAlloc(HYPRE_Int, nrows_A+1, HYPRE_MEMORY_SHARED); 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_CSRMatrixCreate(nrows_A, ncols_A, num_nonzeros); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixBigInitialize(C); C_j = hypre_CSRMatrixBigJ(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; 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); 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_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 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, ja, jb, num_nonzeros=0; HYPRE_Int row_start, counter; HYPRE_Complex a_entry, b_entry; HYPRE_Int allsquare = 0; HYPRE_Int max_num_threads; HYPRE_Int *jj_count; 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; C_i = hypre_CTAlloc(HYPRE_Int, nrows_A+1, HYPRE_MEMORY_SHARED); max_num_threads = hypre_NumThreads(); jj_count = hypre_CTAlloc(HYPRE_Int, max_num_threads, HYPRE_MEMORY_HOST); #ifdef HYPRE_USING_OPENMP #pragma omp parallel private(ia, ib, ic, ja, jb, num_nonzeros, row_start, counter, a_entry, b_entry) #endif { HYPRE_Int *B_marker = NULL; HYPRE_Int ns, ne, ii, jj; HYPRE_Int size, rest, num_threads; HYPRE_Int i1; ii = hypre_GetThreadNum(); num_threads = hypre_NumActiveThreads(); size = nrows_A/num_threads; rest = nrows_A - 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; } B_marker = hypre_CTAlloc(HYPRE_Int, ncols_B, HYPRE_MEMORY_HOST); for (ib = 0; ib < ncols_B; ib++) B_marker[ib] = -1; num_nonzeros = 0; for (ic = ns; ic < ne; ic++) { C_i[ic] = num_nonzeros; if (allsquare) { B_marker[ic] = ic; num_nonzeros++; } 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++; } } } } jj_count[ii] = num_nonzeros; #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (ii) { jj = jj_count[0]; for (i1 = 1; i1 < ii; i1++) jj += jj_count[i1]; for (i1 = ns; i1 < ne; i1++) C_i[i1] += jj; } else { C_i[nrows_A] = 0; for (i1 = 0; i1 < num_threads; i1++) C_i[nrows_A] += jj_count[i1]; C = hypre_CSRMatrixCreate(nrows_A, ncols_B, C_i[nrows_A]); hypre_CSRMatrixI(C) = C_i; hypre_CSRMatrixInitialize(C); C_j = hypre_CSRMatrixJ(C); C_data = hypre_CSRMatrixData(C); } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif for (ib = 0; ib < ncols_B; ib++) B_marker[ib] = -1; counter = C_i[ns]; for (ic = ns; ic < ne; ic++) { row_start = C_i[ic]; if (allsquare) { B_marker[ic] = counter; C_data[counter] = 0; C_j[counter] = ic; counter++; } for (ia = A_i[ic]; ia < A_i[ic+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] < row_start) { 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_TFree(B_marker, HYPRE_MEMORY_HOST); } /*end parallel region */ hypre_TFree(jj_count, HYPRE_MEMORY_HOST); return C; } hypre_CSRMatrix* hypre_CSRMatrixMultiply( hypre_CSRMatrix *A, hypre_CSRMatrix *B) { HYPRE_Int exec = hypre_GetExecPolicy2( hypre_CSRMatrixMemoryLocation(A), hypre_CSRMatrixMemoryLocation(B) ); hypre_assert(exec != HYPRE_EXEC_UNSET); hypre_CSRMatrix *C = NULL; if (exec == HYPRE_EXEC_HOST) { C = hypre_CSRMatrixMultiplyHost(A,B); } #if defined(HYPRE_USING_CUDA) else { C = hypre_CSRMatrixMultiplyDevice(A,B); } #endif return C; } 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 = 0; 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_CSRMatrixTranspose *--------------------------------------------------------------------------*/ 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 num_rowsA = hypre_CSRMatrixNumRows(A); HYPRE_Int num_colsA = hypre_CSRMatrixNumCols(A); HYPRE_Int num_nonzerosA = hypre_CSRMatrixNumNonzeros(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; /*-------------------------------------------------------------- * 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_nonzerosA && ! 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; *AT = hypre_CSRMatrixCreate(num_rowsAT, num_colsAT, num_nonzerosAT); if (0 == num_colsA) { // JSP: parallel counting sorting breaks down // when A has no columns hypre_CSRMatrixInitialize(*AT); return 0; } AT_j = hypre_CTAlloc(HYPRE_Int, num_nonzerosAT, HYPRE_MEMORY_SHARED); hypre_CSRMatrixJ(*AT) = AT_j; if (data) { AT_data = hypre_CTAlloc(HYPRE_Complex, num_nonzerosAT, HYPRE_MEMORY_SHARED); hypre_CSRMatrixData(*AT) = AT_data; } /*----------------------------------------------------------------- * Parallel count sort *-----------------------------------------------------------------*/ HYPRE_Int *bucket = hypre_TAlloc( HYPRE_Int, (num_colsA + 1)*hypre_NumThreads(), HYPRE_MEMORY_SHARED); #ifdef HYPRE_USING_OPENMP #pragma omp parallel #endif { HYPRE_Int num_threads = hypre_NumActiveThreads(); HYPRE_Int my_thread_num = hypre_GetThreadNum(); HYPRE_Int iBegin = hypre_CSRMatrixGetLoadBalancedPartitionBegin(A); HYPRE_Int iEnd = hypre_CSRMatrixGetLoadBalancedPartitionEnd(A); hypre_assert(iBegin <= iEnd); hypre_assert(iBegin >= 0 && iBegin <= num_rowsA); hypre_assert(iEnd >= 0 && iEnd <= num_rowsA); HYPRE_Int i, j; memset(bucket + my_thread_num*num_colsA, 0, sizeof(HYPRE_Int)*num_colsA); /*----------------------------------------------------------------- * Count the number of entries that will go into each bucket * bucket is used as HYPRE_Int[num_threads][num_colsA] 2D array *-----------------------------------------------------------------*/ for (j = A_i[iBegin]; j < A_i[iEnd]; ++j) { HYPRE_Int idx = A_j[j]; bucket[my_thread_num*num_colsA + idx]++; } /*----------------------------------------------------------------- * 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 = my_thread_num*num_colsA + 1; i < (my_thread_num + 1)*num_colsA; ++i) { HYPRE_Int transpose_i = transpose_idx(i, num_threads, num_colsA); HYPRE_Int transpose_i_minus_1 = transpose_idx(i - 1, num_threads, num_colsA); 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) { HYPRE_Int j0 = num_colsA*i - 1, j1 = num_colsA*(i + 1) - 1; HYPRE_Int transpose_j0 = transpose_idx(j0, num_threads, num_colsA); HYPRE_Int transpose_j1 = transpose_idx(j1, num_threads, num_colsA); bucket[transpose_j1] += bucket[transpose_j0]; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif if (my_thread_num > 0) { HYPRE_Int transpose_i0 = transpose_idx(num_colsA*my_thread_num - 1, num_threads, num_colsA); HYPRE_Int offset = bucket[transpose_i0]; for (i = my_thread_num*num_colsA; i < (my_thread_num + 1)*num_colsA - 1; ++i) { HYPRE_Int transpose_i = transpose_idx(i, num_threads, num_colsA); bucket[transpose_i] += offset; } } #ifdef HYPRE_USING_OPENMP #pragma omp barrier #endif /*---------------------------------------------------------------- * Load the data and column numbers of AT *----------------------------------------------------------------*/ if (data) { for (i = iEnd - 1; i >= iBegin; --i) { for (j = A_i[i + 1] - 1; j >= A_i[i]; --j) { HYPRE_Int idx = A_j[j]; --bucket[my_thread_num*num_colsA + idx]; HYPRE_Int offset = bucket[my_thread_num*num_colsA + idx]; AT_data[offset] = A_data[j]; AT_j[offset] = i; } } } else { for (i = iEnd - 1; i >= iBegin; --i) { for (j = A_i[i + 1] - 1; j >= A_i[i]; --j) { HYPRE_Int idx = A_j[j]; --bucket[my_thread_num*num_colsA + idx]; HYPRE_Int offset = bucket[my_thread_num*num_colsA + idx]; AT_j[offset] = i; } } } } /*end parallel region */ hypre_CSRMatrixI(*AT) = bucket; // JSP: bucket is hypre_NumThreads() times longer than // the size needed for AT_i, but this should be OK. // If the memory size is a concern, we can allocate // a new memory for AT_i and copy from bucket. hypre_CSRMatrixI(*AT)[num_colsA] = num_nonzerosA; return (0); } HYPRE_Int hypre_CSRMatrixTranspose(hypre_CSRMatrix *A, hypre_CSRMatrix **AT, HYPRE_Int data) { HYPRE_Int exec = hypre_GetExecPolicy1( hypre_CSRMatrixMemoryLocation(A) ); hypre_assert(exec != HYPRE_EXEC_UNSET); HYPRE_Int ierr = 0; if (exec == HYPRE_EXEC_HOST) { ierr = hypre_CSRMatrixTransposeHost(A, AT, data); } #if defined(HYPRE_USING_CUDA) else { ierr = hypre_CSRMatrixTransposeDevice(A, AT, data); } #endif return ierr; } 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_Complex *B_ext_offd_data = NULL; HYPRE_Int *my_diag_array; HYPRE_Int *my_offd_array; HYPRE_BigInt *temp; 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 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_rows_Bext/num_threads; rest = num_rows_Bext - 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_rows_Bext] = B_ext_diag_size; B_ext_offd_i[num_rows_Bext] = 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_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_j[cnt_offd] = Bs_ext_j[j]; B_ext_offd_data[cnt_offd++] = Bs_ext_data[j]; } else { B_ext_diag_j[cnt_diag] = 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_j[j], num_cols_offd_C); } } } /* end parallel region */ hypre_TFree(my_diag_array, HYPRE_MEMORY_HOST); hypre_TFree(my_offd_array, HYPRE_MEMORY_HOST); Bext_diag = hypre_CSRMatrixCreate(num_rows_Bext, 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_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 i, j, tempi, row_size; HYPRE_Complex tempd; HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A); HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int num_rowsA = hypre_CSRMatrixNumRows(A); HYPRE_Int num_colsA = hypre_CSRMatrixNumCols(A); /* the matrix should be square */ if (num_rowsA != num_colsA) return -1; for (i = 0; i < num_rowsA; i++) { row_size = A_i[i+1]-A_i[i]; for (j = 0; j < row_size; j++) { if (A_j[j] == i) { if (j != 0) { tempi = A_j[0]; A_j[0] = A_j[j]; A_j[j] = tempi; tempd = A_data[0]; A_data[0] = A_data[j]; A_data[j] = tempd; } break; } /* diagonal element is missing */ if (j == row_size-1) return -2; } A_j += row_size; A_data += row_size; } return 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; * 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; 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, HYPRE_MEMORY_SHARED); 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(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; for ( i=0; i()); HYPRE_THRUST_CALL(lower_bound, col_map_offd_C, col_map_offd_C + num_cols_offd_C, B_ext_offd_j, B_ext_offd_j + B_ext_offd_nnz, B_ext_offd_j); /* convert to row ptrs */ B_ext_diag_i = hypreDevice_CsrRowIndicesToPtrs(num_rows, B_ext_diag_nnz, B_ext_diag_row_indices); B_ext_offd_i = hypreDevice_CsrRowIndicesToPtrs(num_rows, B_ext_offd_nnz, B_ext_offd_row_indices); /* create diag and offd CSR */ B_ext_diag = hypre_CSRMatrixCreate(num_rows, last_col_diag_B - first_col_diag_B + 1, B_ext_diag_nnz); B_ext_offd = hypre_CSRMatrixCreate(num_rows, num_cols_offd_C, 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; /* free */ /* hypre_TFree(B_ext_diag_row_indices, HYPRE_MEMORY_DEVICE); hypre_TFree(B_ext_offd_row_indices, HYPRE_MEMORY_DEVICE); hypre_TFree(B_ext_row_indices, HYPRE_MEMORY_DEVICE); */ hypre_TFree(work_mem, 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; *B_ext_diag_ptr = B_ext_diag; *B_ext_offd_ptr = B_ext_offd; return hypre_error_flag; } 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; hypreDevice_CSRSpTrans(nrows_A, ncols_A, nnz_A, A_i, A_j, A_data, &C_i, &C_j, &C_data, data); 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; return hypre_error_flag; } /*-------------------------------------------------------------------------- * 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, ncols_A, nnz_A, nnz_B, A_i, A_j, A_data, B_i, B_j, B_data, 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; return C; } 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); HYPRE_THRUST_CALL(sort, A_j_sorted, A_j_sorted + nnz_A); reduced_col_indices = hypre_TAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_DEVICE); reduced_col_nnz = hypre_TAlloc(HYPRE_Int, ncols_A, HYPRE_MEMORY_DEVICE); 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; hypre_Memset(colnnz, 0, ncols_A * sizeof(HYPRE_Real), HYPRE_MEMORY_DEVICE); HYPRE_THRUST_CALL(scatter, reduced_col_nnz, reduced_col_nnz + num_reduced_col_indices, reduced_col_indices, colnnz); hypre_TFree(A_j_sorted, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_col_indices, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_col_nnz, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } __global__ void hypreCUDAKernel_CSRMoveDiagFirst( HYPRE_Int nrows, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa ) { HYPRE_Int row = hypre_cuda_get_grid_warp_id<1,1>(); if (row >= nrows) { return; } HYPRE_Int lane = hypre_cuda_get_lane_id<1>(); HYPRE_Int i, p, q; if (lane < 2) { p = read_only_load(ia + row + lane); } q = __shfl_sync(HYPRE_WARP_FULL_MASK, p, 1); p = __shfl_sync(HYPRE_WARP_FULL_MASK, p, 0); for (i = p + lane + 1; __any_sync(HYPRE_WARP_FULL_MASK, i < q); i += HYPRE_WARP_SIZE) { hypre_int find_diag = i < q && ja[i] == row; if (find_diag) { ja[i] = ja[p]; ja[p] = row; HYPRE_Complex tmp = aa[p]; aa[p] = aa[i]; aa[i] = tmp; } if ( __any_sync(HYPRE_WARP_FULL_MASK, find_diag) ) { break; } } } 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, gDim; bDim = hypre_GetDefaultCUDABlockDimension(); gDim = hypre_GetDefaultCUDAGridDimension(nrows, "warp", bDim); HYPRE_CUDA_LAUNCH(hypreCUDAKernel_CSRMoveDiagFirst, gDim, bDim, nrows, A_i, A_j, A_data); return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_matrix.c000066400000000000000000000633601355566575400173700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_CSRMatrixNumCols(matrix) = num_cols; hypre_CSRMatrixNumNonzeros(matrix) = num_nonzeros; hypre_CSRMatrixMemoryLocation(matrix) = HYPRE_MEMORY_SHARED; /* HYPRE_MEMORY_UNSET; */ /* TODO !!! */ /* set defaults */ hypre_CSRMatrixOwnsData(matrix) = 1; hypre_CSRMatrixNumRownnz(matrix) = num_rows; #ifdef HYPRE_BIGINT matrix->i_short=NULL; matrix->j_short=NULL; #endif return matrix; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixDestroy *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixDestroy( hypre_CSRMatrix *matrix ) { HYPRE_Int ierr = 0; if (matrix) { HYPRE_Int 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); hypre_TFree(hypre_CSRMatrixBigJ(matrix), memory_location); } hypre_TFree(matrix, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixInitialize_v2( hypre_CSRMatrix *matrix, HYPRE_Int bigInit, HYPRE_Int memory_location ) { HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int num_nonzeros = hypre_CSRMatrixNumNonzeros(matrix); /* HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(matrix); */ HYPRE_Int ierr = 0; 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 ierr; } HYPRE_Int hypre_CSRMatrixInitialize( hypre_CSRMatrix *matrix ) { HYPRE_Int ierr; ierr = hypre_CSRMatrixInitialize_v2( matrix, 0, hypre_CSRMatrixMemoryLocation(matrix) ); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixBigInitialize( hypre_CSRMatrix *matrix ) { HYPRE_Int ierr; ierr = hypre_CSRMatrixInitialize_v2( matrix, 1, hypre_CSRMatrixMemoryLocation(matrix) ); return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixBigJtoJ *--------------------------------------------------------------------------*/ 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; HYPRE_Int i; /* HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(matrix); */ HYPRE_Int ierr=0; if (num_nonzeros && matrix_big_j ) { matrix_j = hypre_CTAlloc(HYPRE_Int, num_nonzeros, HYPRE_MEMORY_SHARED); for (i=0; i < num_nonzeros; i++) { matrix_j[i] = (HYPRE_Int) matrix_big_j[i]; } hypre_CSRMatrixJ(matrix) = matrix_j; hypre_TFree(matrix_big_j, HYPRE_MEMORY_SHARED); hypre_CSRMatrixBigJ(matrix) = NULL; } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixJtoBigJ *--------------------------------------------------------------------------*/ 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; HYPRE_Int i; /* HYPRE_Int num_rownnz = hypre_CSRMatrixNumRownnz(matrix); */ HYPRE_Int ierr=0; if (num_nonzeros && matrix_j ) { matrix_big_j = hypre_CTAlloc(HYPRE_BigInt, num_nonzeros, HYPRE_MEMORY_SHARED); for (i=0; i < num_nonzeros; i++) { matrix_big_j[i] = (HYPRE_BigInt) matrix_j[i]; } hypre_CSRMatrixBigJ(matrix) = matrix_big_j; hypre_TFree(matrix_j, HYPRE_MEMORY_SHARED); hypre_CSRMatrixJ(matrix) = NULL; } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_CSRMatrixSetDataOwner( hypre_CSRMatrix *matrix, HYPRE_Int owns_data ) { HYPRE_Int ierr = 0; hypre_CSRMatrixOwnsData(matrix) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * 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 ) { HYPRE_Int ierr = 0; HYPRE_Int num_rows = hypre_CSRMatrixNumRows(matrix); HYPRE_Int *A_i = hypre_CSRMatrixI(matrix); HYPRE_Int *Arownnz; HYPRE_Int i, adiag; HYPRE_Int irownnz = 0; for (i = 0; i < num_rows; i++) { adiag = A_i[i+1] - A_i[i]; if(adiag > 0) { irownnz++; } } hypre_CSRMatrixNumRownnz(matrix) = irownnz; if (irownnz == 0 || irownnz == num_rows) { hypre_CSRMatrixRownnz(matrix) = NULL; } else { Arownnz = hypre_CTAlloc(HYPRE_Int, irownnz, HYPRE_MEMORY_SHARED); irownnz = 0; for (i = 0; i < num_rows; i++) { adiag = A_i[i+1] - A_i[i]; if(adiag > 0) { Arownnz[irownnz++] = i; } } hypre_CSRMatrixRownnz(matrix) = Arownnz; } 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_SHARED); 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(matrix); 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; 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_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); 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); } for (j = 0; j < matrix_i[num_rows]; j++) { hypre_fprintf(fp, "%d\n", matrix_j[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_Int hypre_CSRMatrixPrintMM( hypre_CSRMatrix *matrix, HYPRE_Int basei, HYPRE_Int basej, HYPRE_Int trans, const char *file_name ) { FILE *fp; HYPRE_Complex *matrix_data; HYPRE_Int *matrix_i; HYPRE_Int *matrix_j; HYPRE_Int num_rows, num_cols; /* HYPRE_Int file_base = 1; */ HYPRE_Int j,k; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * Print the matrix data *----------------------------------------------------------*/ matrix_data = hypre_CSRMatrixData(matrix); matrix_i = hypre_CSRMatrixI(matrix); matrix_j = hypre_CSRMatrixJ(matrix); num_rows = hypre_CSRMatrixNumRows(matrix); num_cols = hypre_CSRMatrixNumCols(matrix); if (file_name) { fp = fopen(file_name, "w"); } else { fp = stdout; } hypre_fprintf(fp, "%%%%MatrixMarket matrix coordinate real general\n"); hypre_assert(matrix_i[num_rows] == hypre_CSRMatrixNumNonzeros(matrix)); if (!trans) { hypre_fprintf(fp, "%d %d %d\n", num_rows, num_cols, hypre_CSRMatrixNumNonzeros(matrix)); } else { hypre_fprintf(fp, "%d %d %d\n", num_cols, num_rows, hypre_CSRMatrixNumNonzeros(matrix)); } for (j = 0; j < num_rows; j++) { for (k = matrix_i[j]; k < matrix_i[j+1]; k++) { if (!trans) { hypre_fprintf(fp, "%d %d %.15e\n", j + basei, matrix_j[k] + basej, matrix_data[k]); } else { hypre_fprintf(fp, "%d %d %.15e\n", matrix_j[k] + basej, j + basei, matrix_data[k]); } } } if (file_name) { fclose(fp); } return ierr; } HYPRE_Int hypre_CSRMatrixPrint2( hypre_CSRMatrix *matrix, const char *file_name ) { return hypre_CSRMatrixPrintMM(matrix, 0, 0, 0, file_name); } /*-------------------------------------------------------------------------- * 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; HYPRE_Int ierr = 0; /*---------------------------------------------------------- * 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 ierr; } /*-------------------------------------------------------------------------- * 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 ierr = 0; 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_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_Complex *B_data; HYPRE_Int memlocA = hypre_CSRMatrixMemoryLocation(A); HYPRE_Int memlocB = hypre_CSRMatrixMemoryLocation(B); hypre_TMemcpy(B_i, A_i, HYPRE_Int, num_rows + 1, memlocB, memlocA); if (A_j && B_j) { hypre_TMemcpy(B_j, A_j, HYPRE_Int, num_nonzeros, memlocB, memlocA); } if (A_bigj && B_bigj) { hypre_TMemcpy(B_bigj, A_bigj, HYPRE_BigInt, num_nonzeros, memlocB, memlocA); } if (copy_data) { A_data = hypre_CSRMatrixData(A); B_data = hypre_CSRMatrixData(B); hypre_TMemcpy(B_data, A_data, HYPRE_Complex, num_nonzeros, memlocB, memlocA); } return ierr; } /*-------------------------------------------------------------------------- * hypre_CSRMatrixClone * Creates and returns a new copy of the argument, A. * Copying is a deep copy in that no pointers are copied; new arrays are * created where necessary. *--------------------------------------------------------------------------*/ hypre_CSRMatrix* hypre_CSRMatrixClone_v2( hypre_CSRMatrix *A, HYPRE_Int copy_data, HYPRE_Int 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_CSRMatrix* hypre_CSRMatrixClone( hypre_CSRMatrix *A, HYPRE_Int copy_data ) { return hypre_CSRMatrixClone_v2(A, copy_data, HYPRE_MEMORY_SHARED); } /*-------------------------------------------------------------------------- * 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, big_jB; HYPRE_Int i, jA, jB; HYPRE_Int ma, mb, mc, ma_min, ma_max, match; hypre_CSRMatrix * C; 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_SHARED); num_cols = num_cols_A; /* initialization; we'll compute the actual value */ for ( jB=0; jB= num_threads) { return num_rowsA; } else { return (HYPRE_Int)(hypre_LowerBound(A_i, A_i + num_rowsA, nonzeros_per_thread*idx) - A_i); } } HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionBegin(hypre_CSRMatrix *A) { return hypre_CSRMatrixGetLoadBalancedPartitionBoundary(A, hypre_GetThreadNum()); } HYPRE_Int hypre_CSRMatrixGetLoadBalancedPartitionEnd(hypre_CSRMatrix *A) { return hypre_CSRMatrixGetLoadBalancedPartitionBoundary(A, hypre_GetThreadNum() + 1); } HYPRE_Int hypre_CSRMatrixPrefetch( hypre_CSRMatrix *A, HYPRE_Int to_location ) { HYPRE_Int ierr = 0; #ifdef HYPRE_USING_UNIFIED_MEMORY if (hypre_GetActualMemLocation(hypre_CSRMatrixMemoryLocation(A)) != HYPRE_MEMORY_SHARED) { return 1; } 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); /* speical use of TMemcpy for prefetch */ hypre_TMemcpy(data, data, HYPRE_Complex, nnzA, to_location, HYPRE_MEMORY_SHARED); //hypre_HandleCudaPrefetchStreamNum(hypre_handle) ++; hypre_TMemcpy(ia, ia, HYPRE_Int, nrow+1, to_location, HYPRE_MEMORY_SHARED); //hypre_HandleCudaPrefetchStreamNum(hypre_handle) ++; hypre_TMemcpy(ja, ja, HYPRE_Int, nnzA, to_location, HYPRE_MEMORY_SHARED); #endif return ierr; } /* HYPRE_Int hypre_CSRMatrixIsManaged(hypre_CSRMatrix *a) { } */ hypre-2.18.2/src/seq_mv/csr_matrix.h000066400000000000000000000066371355566575400174010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- * 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; /* Does the CSRMatrix create/destroy `data', `i', `j'? */ HYPRE_Int owns_data; HYPRE_Complex *data; /* for compressing rows in matrix multiplication */ HYPRE_Int *rownnz; HYPRE_Int num_rownnz; } 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) 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.18.2/src/seq_mv/csr_matvec.c000066400000000000000000000665121355566575400173450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_CSRMatrixMatvec *--------------------------------------------------------------------------*/ /* 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 ) { #ifdef HYPRE_PROFILE HYPRE_Real time_begin = hypre_MPI_Wtime(); #endif #if defined(HYPRE_USING_CUDA) /* CUDA */ #ifdef HYPRE_BIGINT HYPRE_Int ierr = hypre_CSRMatrixMatvecDeviceBIGINT(alpha, A, x, beta, b, y, offset); #else HYPRE_Int ierr = hypre_CSRMatrixMatvecDevice(0, alpha, A, x, beta, b, y, offset); #endif #elif defined(HYPRE_USING_DEVICE_OPENMP) /* OMP 4.5 */ HYPRE_Int ierr = hypre_CSRMatrixMatvecOutOfPlaceOOMP(0, alpha, A, x, beta, b, y, offset); #else /* CPU */ 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 num_nnz = hypre_CSRMatrixNumNonzeros(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) ); 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); } /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ temp = beta / alpha; /* use rownnz pointer to do the A*x multiplication when num_rownnz is smaller than num_rows */ if (num_rownnz < xpar*(num_rows) || num_vectors > 1) { /*----------------------------------------------------------------------- * y = (beta/alpha)*y *-----------------------------------------------------------------------*/ 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] = b_data[i]*temp; } } else { for (i = 0; i < num_rows*num_vectors; i++) y_data[i] = b_data[i]; } /*----------------------------------------------------------------- * y += A*x *-----------------------------------------------------------------*/ if (num_rownnz < xpar*(num_rows)) { #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 (jj = A_i[m]; jj < A_i[m+1]; jj++) * { * j = A_j[jj]; * y_data[m] += A_data[jj] * x_data[j]; * } */ if ( num_vectors==1 ) { tempx = 0; for (jj = A_i[m]; jj < A_i[m+1]; jj++) tempx += A_data[jj] * x_data[A_j[jj]]; y_data[m] += tempx; } else for ( j=0; j 1 { #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; 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; } } } /*----------------------------------------------------------------- * 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 { // JSP: this is currently the only path optimized #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 (0 == temp) { if (1 == alpha) // 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 (-1 == alpha) { 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 (-1 == temp) // beta == -alpha { if (1 == alpha) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { tempx = -b_data[i]; 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 (-1 == alpha) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { tempx = b_data[i]; 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++) { tempx = -b_data[i]; 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 (1 == temp) { if (1 == alpha) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { tempx = b_data[i]; 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 (-1 == alpha) { for (i = iBegin; i < iEnd; i++) { tempx = -b_data[i]; 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++) { tempx = b_data[i]; 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 (1 == alpha) // JSP: a common path { for (i = iBegin; i < iEnd; i++) { tempx = b_data[i]*temp; 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 (-1 == alpha) { for (i = iBegin; i < iEnd; i++) { tempx = -b_data[i]*temp; 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++) { tempx = b_data[i]*temp; 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); } #endif /* CPU */ #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_CSRMatrixMatvecT( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *y ) { #if defined(HYPRE_USING_CUDA) /* CUDA */ HYPRE_Int ierr = hypre_CSRMatrixMatvecDevice(1, alpha, A, x, beta, y, y, 0 ); #elif defined(HYPRE_USING_DEVICE_OPENMP) /* OMP 4.5 */ HYPRE_Int ierr = hypre_CSRMatrixMatvecOutOfPlaceOOMP(1, alpha, A, x, beta, y, y, 0); #else /* CPU */ 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; jvdata, y->size-offset, y->data ); } if (x == y) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"ERROR::x and y are the same pointer in hypre_CSRMatrixMatvecDevice\n"); } // TODO if (offset != 0) { hypre_printf("WARNING:: Offset is not zero in hypre_CSRMatrixMatvecDevice :: \n"); } hypre_assert(offset == 0); if (trans) { HYPRE_Complex *csc_a = hypre_TAlloc(HYPRE_Complex, A->num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_j = hypre_TAlloc(HYPRE_Int, A->num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_i = hypre_TAlloc(HYPRE_Int, A->num_cols+1, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseDcsr2csc(handle, A->num_rows, A->num_cols, A->num_nonzeros, A->data, A->i, A->j, csc_a, csc_j, csc_i, CUSPARSE_ACTION_NUMERIC, CUSPARSE_INDEX_BASE_ZERO) ); HYPRE_CUSPARSE_CALL( cusparseDcsrmv(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, A->num_cols, A->num_rows, A->num_nonzeros, &alpha, descr, csc_a, csc_i, csc_j, x->data, &beta, y->data) ); hypre_TFree(csc_a, HYPRE_MEMORY_DEVICE); hypre_TFree(csc_i, HYPRE_MEMORY_DEVICE); hypre_TFree(csc_j, HYPRE_MEMORY_DEVICE); } else { HYPRE_CUSPARSE_CALL( cusparseDcsrmv(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, A->num_rows-offset, A->num_cols, A->num_nonzeros, &alpha, descr, A->data, A->i+offset, A->j, x->data, &beta, y->data+offset) ); } hypre_SyncCudaComputeStream(hypre_handle); #endif return hypre_error_flag; } HYPRE_Int hypre_CSRMatrixMatvecDeviceBIGINT( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ) { #ifdef HYPRE_BIGINT #error "TODO BigInt" #endif return 0; } #endif hypre-2.18.2/src/seq_mv/csr_matvec_oomp.c000066400000000000000000000120211355566575400203610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #if defined(HYPRE_USING_DEVICE_OPENMP) /*-------------------------------------------------------------------------- * hypre_CSRMatrixMatvec *--------------------------------------------------------------------------*/ /* y[offset:end] = alpha*A[offset:end,:]*x + beta*b[offset:end] */ HYPRE_Int hypre_CSRMatrixMatvecOutOfPlaceOOMP( 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 A_nrows = hypre_CSRMatrixNumRows(A); HYPRE_Int A_ncols = hypre_CSRMatrixNumCols(A); HYPRE_Int A_nnz = hypre_CSRMatrixNumNonzeros(A); HYPRE_Complex *A_data = hypre_CSRMatrixData(A); HYPRE_Int *A_i = hypre_CSRMatrixI(A) + offset; HYPRE_Int *A_j = hypre_CSRMatrixJ(A); HYPRE_Int y_size = hypre_VectorSize(y) - offset; 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 i; #ifdef HYPRE_USING_CUSPARSE cusparseHandle_t handle = hypre_HandleCusparseHandle(hypre_handle); cusparseMatDescr_t descr = hypre_HandleCusparseMatDescr(hypre_handle); #endif hypre_CSRMatrixPrefetch(A, HYPRE_MEMORY_DEVICE); hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); hypre_SeqVectorPrefetch(b, HYPRE_MEMORY_DEVICE); if (b != y) { hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); } if (b != y) { #pragma omp target teams distribute parallel for private(i) is_device_ptr(y_data, b_data) for (i = 0; i < y_size; i++) { y_data[i] = b_data[i]; } } if (x == y) { hypre_error_w_msg(HYPRE_ERROR_GENERIC,"ERROR::x and y are the same pointer in hypre_CSRMatrixMatvecDevice\n"); } // TODO if (offset != 0) { hypre_printf("WARNING:: Offset is not zero in hypre_CSRMatrixMatvecDevice :: \n"); } hypre_assert(offset == 0); if (trans) { HYPRE_Complex *csc_a = hypre_TAlloc(HYPRE_Complex, A->num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_j = hypre_TAlloc(HYPRE_Int, A->num_nonzeros, HYPRE_MEMORY_DEVICE); HYPRE_Int *csc_i = hypre_TAlloc(HYPRE_Int, A->num_cols+1, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseDcsr2csc(handle, A->num_rows, A->num_cols, A->num_nonzeros, A->data, A->i, A->j, csc_a, csc_j, csc_i, CUSPARSE_ACTION_NUMERIC, CUSPARSE_INDEX_BASE_ZERO) ); #ifdef HYPRE_USING_CUSPARSE HYPRE_CUSPARSE_CALL( cusparseDcsrmv(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, A->num_cols, A->num_rows, A->num_nonzeros, &alpha, descr, csc_a, csc_i, csc_j, x->data, &beta, y->data) ); #else #pragma omp target teams distribute parallel for private(i) is_device_ptr(csc_a, csc_i, csc_j, y_data, x_data) for (i = 0; i < A_ncols; i++) { HYPRE_Complex tempx = 0.0; HYPRE_Int j; for (j = csc_i[i]; j < csc_i[i+1]; j++) { tempx += csc_a[j] * x_data[csc_j[j]]; } y_data[i] = alpha*tempx + beta*y_data[i]; } #endif hypre_TFree(csc_a, HYPRE_MEMORY_DEVICE); hypre_TFree(csc_i, HYPRE_MEMORY_DEVICE); hypre_TFree(csc_j, HYPRE_MEMORY_DEVICE); } else { #ifdef HYPRE_USING_CUSPARSE HYPRE_CUSPARSE_CALL( cusparseDcsrmv(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, A_nrows, A_ncols, A_nnz, &alpha, descr, A_data, A_i, A_j, x_data, &beta, y_data) ); #else #pragma omp target teams distribute parallel for private(i) is_device_ptr(A_data, A_i, A_j, y_data, x_data) for (i = 0; i < A_num_rows; 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]; } #endif } return hypre_error_flag; } #endif /* #if defined(HYPRE_USING_DEVICE_OPENMP) */ hypre-2.18.2/src/seq_mv/csr_spadd_device.c000066400000000000000000000152261355566575400204740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_CUDA) /* in Matlab notation: if num_b != NULL, C = A, and * for each num_b[i], A(num_b[i], :) += B(i,:). * A is ma x n and B is mb x n. len(num_b) == mb. * NOTE: all numbers in num_b must be in [0,...,ma-1] * if num_b == NULL, C = A + B. ma == mb * C is ma x n in both cases */ HYPRE_Int hypreDevice_CSRSpAdd(HYPRE_Int ma, HYPRE_Int mb, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int nnzB, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_ab, 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 /* expand */ HYPRE_Int nnzT = nnzA + nnzB, nnzC; HYPRE_Int *d_it, *d_jt, *d_pm, *d_it_cp, *d_jt_cp, *d_ic, *d_jc; HYPRE_Complex *d_at, *d_at_cp, *d_ac; HYPRE_Int align = 32; HYPRE_Int nnzT2 = (nnzT + align - 1) / align * align; char *work_mem = hypre_TAlloc(char, (5*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 */ hypre_TMemcpy(d_jt, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jt + nnzA, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_at, d_aa, HYPRE_Complex, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_at + nnzA, d_ab, HYPRE_Complex, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypreDevice_CsrRowPtrsToIndices_v2(ma, d_ia, d_it); if (d_num_b || mb <= 0) { hypreDevice_CsrRowPtrsToIndicesWithRowNum(mb, d_ib, d_num_b, d_it + nnzA); } else { hypre_assert(ma == mb); hypreDevice_CsrRowPtrsToIndices_v2(mb, d_ib, d_it + nnzA); } /* permutation vector */ //d_pm = hypre_TAlloc(HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE); d_pm = (HYPRE_Int *) work_mem; work_mem += sizeof(HYPRE_Int) * nnzT2; /* make copy of (it, jt, at), since gather 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(work_mem - work_mem_saved == (5*sizeof(HYPRE_Int)+2*sizeof(HYPRE_Complex))*nnzT2); hypre_TMemcpy(d_it_cp, d_it, HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_jt_cp, d_jt, HYPRE_Int, nnzT, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(d_at_cp, d_at, HYPRE_Complex, nnzT, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); /* sort: lexicographical order (row, col) */ HYPRE_THRUST_CALL(sequence, d_pm, d_pm + nnzT); HYPRE_THRUST_CALL(stable_sort_by_key, d_jt, d_jt + nnzT, d_pm); HYPRE_THRUST_CALL(gather, d_pm, d_pm + nnzT, d_it_cp, d_it); HYPRE_THRUST_CALL(stable_sort_by_key, d_it, d_it + nnzT, d_pm); HYPRE_THRUST_CALL(gather, d_pm, d_pm + nnzT, d_jt_cp, d_jt); HYPRE_THRUST_CALL(gather, d_pm, d_pm + nnzT, d_at_cp, d_at); /* compress */ typedef thrust::tuple< thrust::device_ptr, thrust::device_ptr > IteratorTuple; typedef thrust::zip_iterator ZipIterator; thrust::pair< ZipIterator, thrust::device_ptr > new_end = HYPRE_THRUST_CALL(reduce_by_key, thrust::make_zip_iterator(thrust::make_tuple(d_it , d_jt )), thrust::make_zip_iterator(thrust::make_tuple(d_it + nnzT, d_jt + nnzT)), d_at, thrust::make_zip_iterator(thrust::make_tuple(d_it_cp, d_jt_cp)), d_at_cp, thrust::equal_to< thrust::tuple >() ); /* returns end: so nnz = end - start */ nnzC = new_end.second - thrust::device_pointer_cast(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); #if DEBUG_MODE HYPRE_Int tmp_nnzC; hypre_TMemcpy(&tmp_nnzC, &d_ic[ma], HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); 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_pm, 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 cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPADD] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif hypre-2.18.2/src/seq_mv/csr_spgemm_device.c000066400000000000000000000057111355566575400206670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #if defined(HYPRE_USING_CUDA) HYPRE_Int hypreDevice_CSRSpGemm(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnza, HYPRE_Int nnzb, 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_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC) { /* trivial case */ if (nnza == 0 || nnzb == 0) { *d_ic_out = hypre_CTAlloc(HYPRE_Int, m + 1, HYPRE_MEMORY_DEVICE); *d_jc_out = hypre_CTAlloc(HYPRE_Int, 0, HYPRE_MEMORY_DEVICE); *d_c_out = hypre_CTAlloc(HYPRE_Complex, 0, HYPRE_MEMORY_DEVICE); *nnzC = 0; return hypre_error_flag; } #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPMM] -= hypre_MPI_Wtime(); #endif /* use CUSPARSE */ if (hypre_handle->spgemm_use_cusparse) { hypreDevice_CSRSpGemmCusparse(m, k, n, nnza, d_ia, d_ja, d_a, nnzb, d_ib, d_jb, d_b, nnzC, d_ic_out, d_jc_out, d_c_out); } else { HYPRE_Int m2 = hypre_handle->spgemm_num_passes < 3 ? m : 2*m; HYPRE_Int *d_rc = hypre_TAlloc(HYPRE_Int, m2, HYPRE_MEMORY_DEVICE); hypreDevice_CSRSpGemmRownnzEstimate(m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc); if (hypre_handle->spgemm_num_passes < 3) { hypreDevice_CSRSpGemmWithRownnzEstimate(m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, d_ic_out, d_jc_out, d_c_out, nnzC); } else { HYPRE_Int rownnz_exact; /* a binary array to indicate if row nnz counting is failed for a row */ //HYPRE_Int *d_rf = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_rf = d_rc + m; hypreDevice_CSRSpGemmRownnzUpperbound(m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, d_rf); /* row nnz is exact if no row failed */ rownnz_exact = hypreDevice_IntegerReduceSum(m, d_rf) == 0; //hypre_TFree(d_rf, HYPRE_MEMORY_DEVICE); hypreDevice_CSRSpGemmWithRownnzUpperbound(m, k, n, d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_rc, rownnz_exact, d_ic_out, d_jc_out, d_c_out, nnzC); } hypre_TFree(d_rc, HYPRE_MEMORY_DEVICE); } #ifdef HYPRE_PROFILE cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPMM] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device.h000066400000000000000000000105141355566575400206710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #if defined(HYPRE_USING_CUDA) #define COHEN_USE_SHMEM 0 #define DEBUG_MODE 0 /* these are under the assumptions made in spgemm on block sizes: only use in spmm routines */ static __device__ __forceinline__ hypre_int get_block_size() { //return (blockDim.x * blockDim.y * blockDim.z); // in general cases return (HYPRE_WARP_SIZE * blockDim.z); // if blockDim.x * blockDim.y = WARP_SIZE } static __device__ __forceinline__ hypre_int get_thread_id() { //return (threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x); // in general cases return (threadIdx.z * HYPRE_WARP_SIZE + threadIdx.y * blockDim.x + threadIdx.x); // if blockDim.x * blockDim.y = WARP_SIZE } static __device__ __forceinline__ hypre_int get_warp_id() { // return get_thread_id() >> 5; // in general cases return threadIdx.z; // if blockDim.x * blockDim.y = WARP_SIZE } static __device__ __forceinline__ hypre_int get_lane_id() { // return get_thread_id() & (WARP_SIZE-1); // in general cases return threadIdx.y * blockDim.x + threadIdx.x; // if blockDim.x * blockDim.y = WARP_SIZE } /* 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 (type == 'L') { //hashval = (key + i) % m; hashval = ( prev + 1 ) & (m - 1); } else if (type == 'Q') { //hashval = (key + (i + i*i)/2) & (m-1); hashval = ( prev + i ) & (m - 1); } else if (type == 'D') { //hashval = (key + i*Hash2Func(key) ) & (m - 1); hashval = ( prev + Hash2Func(key) ) & (m - 1); } return hashval; } 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 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 *d_rc, HYPRE_Int *d_rf); HYPRE_Int hypreDevice_CSRSpGemmRownnz(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 hypreDevice_CSRSpGemmWithRownnzUpperbound(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 hypreDevice_CSRSpGemmWithRownnzEstimate(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 **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC); HYPRE_Int hypreDevice_CSRSpGemmCusparse(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); void csr_spmm_create_ija(HYPRE_Int m, HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz); void csr_spmm_create_ija(HYPRE_Int m, HYPRE_Int *d_c, HYPRE_Int **d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz); HYPRE_Int csr_spmm_create_hash_table(HYPRE_Int m, HYPRE_Int *d_rc, HYPRE_Int *d_rf, HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int num_ghash, HYPRE_Int **d_ghash_i, HYPRE_Int **d_ghash_j, HYPRE_Complex **d_ghash_a, HYPRE_Int *ghash_size); #endif /* HYPRE_USING_CUDA */ #endif hypre-2.18.2/src/seq_mv/csr_spgemm_device_attempt.c000066400000000000000000000465271355566575400224370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 SpMM with Row Nnz Estimation *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_CUDA) template static __device__ __forceinline__ HYPRE_Int hash_insert_attempt( HYPRE_Int HashSize, /* capacity of the hash table */ volatile HYPRE_Int *HashKeys, /* assumed to be initialized as all -1's */ volatile HYPRE_Complex *HashVals, /* assumed to be initialized as all 0's */ HYPRE_Int key, /* assumed to be nonnegative */ HYPRE_Complex val, HYPRE_Int &count, /* increase by 1 if is a new entry */ char failed, volatile char *warp_failed) { #pragma unroll for (HYPRE_Int i = 0; i < HashSize; i++) { HYPRE_Int j; /* 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 */ HYPRE_Int old = atomicCAS((HYPRE_Int*)(HashKeys+j), -1, key); if (old == -1) { /* new insertion, increase counter */ count++; /* this slot was open, insert value */ if (attempt == 2 || failed == 0 || *warp_failed == 0) { atomicAdd((HYPRE_Complex*)(HashVals+j), val); } return j; } if (old == key) { /* this slot contains 'key', update value */ if (attempt == 2 || failed == 0 || *warp_failed == 0) { atomicAdd((HYPRE_Complex*)(HashVals+j), val); } return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int csr_spmm_compute_row_attempt( HYPRE_Int rowi, volatile HYPRE_Int lane_id, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Complex *ab, HYPRE_Int s_HashSize, volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, HYPRE_Int g_HashSize, HYPRE_Int *g_HashKeys, HYPRE_Complex *g_HashVals, char &failed, volatile char *warp_s_failed) { /* 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 = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); const HYPRE_Int iend = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); HYPRE_Int num_new_insert = 0; /* load column idx and values of row i of A */ for (HYPRE_Int i = istart; i < iend; i += blockDim.y) { HYPRE_Int colA = -1; HYPRE_Complex valA = 0.0; if (threadIdx.x == 0 && i + threadIdx.y < iend) { colA = read_only_load(ja + i + threadIdx.y); valA = read_only_load(aa + i + threadIdx.y); } #if 0 //const HYPRE_Int ymask = get_mask<4>(lane_id); // 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 */ const HYPRE_Int rowB = __shfl_sync(HYPRE_WARP_FULL_MASK, colA, 0, blockDim.x); const HYPRE_Complex mult = __shfl_sync(HYPRE_WARP_FULL_MASK, valA, 0, blockDim.x); /* open this row of B, collectively */ HYPRE_Int tmp = -1; if (rowB != -1 && threadIdx.x < 2) { tmp = read_only_load(ib+rowB+threadIdx.x); } const HYPRE_Int rowB_start = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 0, blockDim.x); const HYPRE_Int rowB_end = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 1, blockDim.x); for (HYPRE_Int k = rowB_start; k < rowB_end; k += blockDim.x) { if (k + threadIdx.x < rowB_end) { const HYPRE_Int k_idx = read_only_load(jb + k + threadIdx.x); const HYPRE_Complex k_val = read_only_load(ab + k + threadIdx.x) * mult; /* first try to insert into shared memory hash table */ HYPRE_Int pos = hash_insert_attempt (s_HashSize, s_HashKeys, s_HashVals, k_idx, k_val, num_new_insert, failed, warp_s_failed); if (-1 == pos) { pos = hash_insert_attempt (g_HashSize, g_HashKeys, g_HashVals, k_idx, k_val, num_new_insert, failed, warp_s_failed); } /* 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; if (attempt == 1) { *warp_s_failed = 1; } } } } } return num_new_insert; } template __global__ void csr_spmm_attempt(HYPRE_Int M, /* HYPRE_Int K, HYPRE_Int N, */ HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Complex *ab, HYPRE_Int *js, HYPRE_Complex *as, HYPRE_Int *ig, HYPRE_Int *jg, HYPRE_Complex *ag, HYPRE_Int *rc, HYPRE_Int *rg) { volatile const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ volatile const HYPRE_Int warp_id = get_warp_id(); /* lane id inside the warp */ volatile HYPRE_Int lane_id = get_lane_id(); /* shared memory hash table */ __shared__ volatile HYPRE_Int s_HashKeys[NUM_WARPS_PER_BLOCK * SHMEM_HASH_SIZE]; __shared__ volatile HYPRE_Complex s_HashVals[NUM_WARPS_PER_BLOCK * SHMEM_HASH_SIZE]; /* shared memory hash table for this warp */ volatile HYPRE_Int *warp_s_HashKeys = s_HashKeys + warp_id * SHMEM_HASH_SIZE; volatile HYPRE_Complex *warp_s_HashVals = s_HashVals + warp_id * SHMEM_HASH_SIZE; /* shared memory failed flag for warps */ __shared__ volatile char s_failed[NUM_WARPS_PER_BLOCK]; volatile char *warp_s_failed = s_failed + warp_id; #if DEBUG_MODE assert(blockDim.z == NUM_WARPS_PER_BLOCK); assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); assert(NUM_WARPS_PER_BLOCK <= HYPRE_WARP_SIZE); #endif for (HYPRE_Int i = blockIdx.x * NUM_WARPS_PER_BLOCK + warp_id; i < M; i += num_warps) { /* start/end position of global memory hash table */ HYPRE_Int j = -1, istart_g, iend_g, ghash_size; char failed = 0; if (lane_id < 2) { j = read_only_load(ig + i + lane_id); } istart_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); iend_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); /* size of global hash table allocated for this row (must be power of 2) */ ghash_size = iend_g - istart_g; if (attempt == 2) { if (ghash_size == 0) { continue; } } /* initialize warp's shared failed flag */ if (attempt == 1 && lane_id == 0) { *warp_s_failed = 0; } /* initialize warp's shared and global memory hash table */ #pragma unrolll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { warp_s_HashKeys[k] = -1; warp_s_HashVals[k] = 0.0; } #pragma unrolll for (HYPRE_Int k = lane_id; k < ghash_size; k += HYPRE_WARP_SIZE) { jg[istart_g+k] = -1; ag[istart_g+k] = 0.0; } __syncwarp(); /* work with two hash tables */ j = csr_spmm_compute_row_attempt(i, lane_id, ia, ja, aa, ib, jb, ab, SHMEM_HASH_SIZE, warp_s_HashKeys, warp_s_HashVals, ghash_size, jg + istart_g, ag + istart_g, failed, warp_s_failed); #if DEBUG_MODE if (attempt == 2) { assert(failed == 0); } #endif /* num of inserts in this row (an upper bound) */ j = warp_reduce_sum(j); if (attempt == 1) { failed = warp_allreduce_sum(failed); } if (attempt == 1 && failed) { if (lane_id == 0) { rg[i] = next_power_of_2(j - SHMEM_HASH_SIZE); } } else { if (lane_id == 0) { rc[i] = j; if (attempt == 1) { rg[i] = 0; } } #pragma unroll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { js[i*SHMEM_HASH_SIZE + k] = warp_s_HashKeys[k]; as[i*SHMEM_HASH_SIZE + k] = warp_s_HashVals[k]; } } } // for (i=...) } template static __device__ __forceinline__ HYPRE_Int copy_from_hash_into_C_row( HYPRE_Int lane_id, volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, HYPRE_Int ghash_size, HYPRE_Int *jg_start, HYPRE_Complex *ag_start, HYPRE_Int *jc_start, HYPRE_Complex *ac_start) { HYPRE_Int j = 0; /* copy shared memory hash table into C */ #pragma unrolll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { HYPRE_Int key, sum, pos; key = s_HashKeys[k]; HYPRE_Int in = key != -1; pos = warp_prefix_sum(lane_id, in, sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = s_HashVals[k]; } j += sum; } /* copy global memory hash table into C */ #pragma unrolll for (HYPRE_Int k = 0; k < ghash_size; k += HYPRE_WARP_SIZE) { HYPRE_Int key = -1, sum, pos; if (k + lane_id < ghash_size) { key = jg_start[k + lane_id]; } HYPRE_Int in = key != -1; pos = warp_prefix_sum(lane_id, in, sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = ag_start[k + lane_id]; } j += sum; } return j; } template __global__ void copy_from_hash_into_C(HYPRE_Int M, HYPRE_Int *js, HYPRE_Complex *as, HYPRE_Int *ig1, HYPRE_Int *jg1, HYPRE_Complex *ag1, HYPRE_Int *ig2, HYPRE_Int *jg2, HYPRE_Complex *ag2, HYPRE_Int *ic, HYPRE_Int *jc, HYPRE_Complex *ac) { const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ const HYPRE_Int warp_id = get_warp_id(); /* lane id inside the warp */ volatile const HYPRE_Int lane_id = get_lane_id(); #if DEBUG_MODE 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 kc, kg1, kg2; /* start/end position in C */ if (lane_id < 2) { kc = read_only_load(ic + i + lane_id); kg1 = read_only_load(ig1 + i + lane_id); kg2 = read_only_load(ig2 + i + lane_id); } HYPRE_Int istart_c = __shfl_sync(HYPRE_WARP_FULL_MASK, kc, 0); #if DEBUG_MODE HYPRE_Int iend_c = __shfl_sync(HYPRE_WARP_FULL_MASK, kc, 1); #endif HYPRE_Int istart_g1 = __shfl_sync(HYPRE_WARP_FULL_MASK, kg1, 0); HYPRE_Int iend_g1 = __shfl_sync(HYPRE_WARP_FULL_MASK, kg1, 1); HYPRE_Int istart_g2 = __shfl_sync(HYPRE_WARP_FULL_MASK, kg2, 0); HYPRE_Int iend_g2 = __shfl_sync(HYPRE_WARP_FULL_MASK, kg2, 1); HYPRE_Int g1_size = iend_g1 - istart_g1; HYPRE_Int g2_size = iend_g2 - istart_g2; #if DEBUG_MODE HYPRE_Int j; #endif if (g2_size == 0) { #if DEBUG_MODE j = #endif copy_from_hash_into_C_row (lane_id, js + i * SHMEM_HASH_SIZE, as + i * SHMEM_HASH_SIZE, g1_size, jg1 + istart_g1, ag1 + istart_g1, jc + istart_c, ac + istart_c); } else { #if DEBUG_MODE j = #endif copy_from_hash_into_C_row (lane_id, js + i * SHMEM_HASH_SIZE, as + i * SHMEM_HASH_SIZE, g2_size, jg2 + istart_g2, ag2 + istart_g2, jc + istart_c, ac + istart_c); } #if DEBUG_MODE assert(istart_c + j == iend_c); #endif } } /* SpGeMM with Rownnz Estimates */ HYPRE_Int hypreDevice_CSRSpGemmWithRownnzEstimate(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 **d_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC) { const HYPRE_Int num_warps_per_block = 20; const HYPRE_Int shmem_hash_size = 128; const HYPRE_Int BDIMX = 2; const HYPRE_Int BDIMY = 16; /* 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 ); char hash_type = hypre_handle->spgemm_hash_type; /* --------------------------------------------------------------------------- * build hash table * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ghash_i, *d_ghash_j, ghash_size; HYPRE_Complex *d_ghash_a; csr_spmm_create_hash_table(m, d_rc, NULL, shmem_hash_size, m, &d_ghash_i, &d_ghash_j, &d_ghash_a, &ghash_size); size_t m_ul = m; HYPRE_Int *d_ic = hypre_TAlloc(HYPRE_Int, m+1, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_ghash2_i = hypre_TAlloc(HYPRE_Int, m+1, HYPRE_MEMORY_DEVICE); HYPRE_Int *d_js = hypre_TAlloc(HYPRE_Int, shmem_hash_size*m_ul, HYPRE_MEMORY_DEVICE); HYPRE_Complex *d_as = hypre_TAlloc(HYPRE_Complex, shmem_hash_size*m_ul, HYPRE_MEMORY_DEVICE); /* --------------------------------------------------------------------------- * 1st multiplication attempt: * ---------------------------------------------------------------------------*/ if (hash_type == 'L') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash_i, d_ghash_j, d_ghash_a, d_ic + 1, d_ghash2_i + 1 ); } else if (hash_type == 'Q') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash_i, d_ghash_j, d_ghash_a, d_ic + 1, d_ghash2_i + 1); } else if (hash_type == 'D') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash_i, d_ghash_j, d_ghash_a, d_ic + 1, d_ghash2_i + 1 ); } else { printf("Unrecognized hash type ... [L, Q, D]\n"); exit(0); } /* --------------------------------------------------------------------------- * build a secondary hash table for long rows * ---------------------------------------------------------------------------*/ HYPRE_Int ghash2_size, *d_ghash2_j; HYPRE_Complex *d_ghash2_a; csr_spmm_create_ija(m, d_ghash2_i, &d_ghash2_j, &d_ghash2_a, &ghash2_size); /* --------------------------------------------------------------------------- * 2nd multiplication attempt: * ---------------------------------------------------------------------------*/ if (ghash2_size > 0) { if (hash_type == 'L') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash2_i, d_ghash2_j, d_ghash2_a, d_ic + 1, NULL ); } else if (hash_type == 'Q') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash2_i, d_ghash2_j, d_ghash2_a, d_ic + 1, NULL); } else if (hash_type == 'D') { HYPRE_CUDA_LAUNCH( (csr_spmm_attempt), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_js, d_as, d_ghash2_i, d_ghash2_j, d_ghash2_a, d_ic + 1, NULL); } else { printf("Unrecognized hash type ... [L, Q, D]\n"); exit(0); } } HYPRE_Int nnzC_gpu, *d_jc; HYPRE_Complex *d_c; csr_spmm_create_ija(m, d_ic, &d_jc, &d_c, &nnzC_gpu); HYPRE_CUDA_LAUNCH( (copy_from_hash_into_C), gDim, bDim, m, d_js, d_as, d_ghash_i, d_ghash_j, d_ghash_a, d_ghash2_i, d_ghash2_j, d_ghash2_a, d_ic, d_jc, d_c); hypre_TFree(d_ghash_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_j, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_a, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash2_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash2_j, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash2_a, HYPRE_MEMORY_DEVICE); hypre_TFree(d_js, HYPRE_MEMORY_DEVICE); hypre_TFree(d_as, HYPRE_MEMORY_DEVICE); *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC = nnzC_gpu; return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device_confident.c000066400000000000000000000432061355566575400227210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 SpMM with Row Nnz Upper Bound *- - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "seq_mv.h" #include "csr_spgemm_device.h" #if defined(HYPRE_USING_CUDA) /*- - - - - - - - - - - - - - - - - - - - - - - - - - * Numerical Multiplication *- - - - - - - - - - - - - - - - - - - - - - - - - - */ template static __device__ __forceinline__ HYPRE_Int hash_insert_numer(HYPRE_Int HashSize, /* capacity of the hash table */ volatile HYPRE_Int *HashKeys, /* assumed to be initialized as all -1's */ volatile HYPRE_Complex *HashVals, /* assumed to be initialized as all 0's */ HYPRE_Int key, /* assumed to be nonnegative */ HYPRE_Complex val, HYPRE_Int &count) { #pragma unroll for (HYPRE_Int i = 0; i < HashSize; i++) { HYPRE_Int j; /* 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 */ HYPRE_Int old = atomicCAS((HYPRE_Int *)(HashKeys+j), -1, key); if (old == -1 || old == key) { if (FAILED_SYMBL) { if (old == -1) { count++; } } /* this slot was open or contained 'key', update value */ atomicAdd((HYPRE_Complex*)(HashVals+j), val); return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int csr_spmm_compute_row_numer(HYPRE_Int rowi, HYPRE_Int lane_id, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Complex *ab, HYPRE_Int s_HashSize, volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, HYPRE_Int g_HashSize, HYPRE_Int *g_HashKeys, HYPRE_Complex *g_HashVals) { /* load the start and end position of row i of A */ HYPRE_Int i; if (lane_id < 2) { i = read_only_load(ia + rowi + lane_id); } const HYPRE_Int istart = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 0); const HYPRE_Int iend = __shfl_sync(HYPRE_WARP_FULL_MASK, i, 1); HYPRE_Int num_new_insert = 0; /* load column idx and values of row i of A */ for (i = istart; i < iend; i += blockDim.y) { HYPRE_Int colA = -1; HYPRE_Complex valA = 0.0; if (threadIdx.x == 0 && i + threadIdx.y < iend) { colA = read_only_load(ja + i + threadIdx.y); valA = read_only_load(aa + i + threadIdx.y); } #if 0 //const HYPRE_Int ymask = get_mask<4>(lane_id); // 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 */ const HYPRE_Int rowB = __shfl_sync(HYPRE_WARP_FULL_MASK, colA, 0, blockDim.x); const HYPRE_Complex mult = __shfl_sync(HYPRE_WARP_FULL_MASK, valA, 0, blockDim.x); /* open this row of B, collectively */ HYPRE_Int tmp = -1; if (rowB != -1 && threadIdx.x < 2) { tmp = read_only_load(ib+rowB+threadIdx.x); } const HYPRE_Int rowB_start = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 0, blockDim.x); const HYPRE_Int rowB_end = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 1, blockDim.x); for (HYPRE_Int k = rowB_start; k < rowB_end; k += blockDim.x) { if (k + threadIdx.x < rowB_end) { const HYPRE_Int k_idx = read_only_load(jb + k + threadIdx.x); const HYPRE_Complex k_val = read_only_load(ab + k + threadIdx.x) * mult; /* first try to insert into shared memory hash table */ HYPRE_Int pos = hash_insert_numer (s_HashSize, s_HashKeys, s_HashVals, k_idx, k_val, num_new_insert); if (-1 == pos) { pos = hash_insert_numer (g_HashSize, g_HashKeys, g_HashVals, k_idx, k_val, num_new_insert); } #if DEBUG_MODE assert(pos != -1); #endif } } } return num_new_insert; } template static __device__ __forceinline__ HYPRE_Int copy_from_hash_into_C_row( HYPRE_Int lane_id, volatile HYPRE_Int *s_HashKeys, volatile HYPRE_Complex *s_HashVals, HYPRE_Int ghash_size, HYPRE_Int *jg_start, HYPRE_Complex *ag_start, HYPRE_Int *jc_start, HYPRE_Complex *ac_start) { HYPRE_Int j = 0; /* copy shared memory hash table into C */ #pragma unrolll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { HYPRE_Int key, sum, pos; key = s_HashKeys[k]; HYPRE_Int in = key != -1; pos = warp_prefix_sum(lane_id, in, sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = s_HashVals[k]; } j += sum; } /* copy global memory hash table into C */ #pragma unrolll for (HYPRE_Int k = 0; k < ghash_size; k += HYPRE_WARP_SIZE) { HYPRE_Int key = -1, sum, pos; if (k + lane_id < ghash_size) { key = jg_start[k + lane_id]; } HYPRE_Int in = key != -1; pos = warp_prefix_sum(lane_id, in, sum); if (key != -1) { jc_start[j + pos] = key; ac_start[j + pos] = ag_start[k + lane_id]; } j += sum; } return j; } template __global__ void csr_spmm_numeric(HYPRE_Int M, /* HYPRE_Int K, HYPRE_Int N, */ HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Complex *aa, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Complex *ab, HYPRE_Int *ic, HYPRE_Int *jc, HYPRE_Complex *ac, HYPRE_Int *rc, HYPRE_Int *ig, HYPRE_Int *jg, HYPRE_Complex *ag) { volatile const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ volatile const HYPRE_Int warp_id = get_warp_id(); /* warp id in the grid */ volatile const HYPRE_Int grid_warp_id = blockIdx.x * NUM_WARPS_PER_BLOCK + warp_id; /* lane id inside the warp */ volatile HYPRE_Int lane_id = get_lane_id(); /* shared memory hash table */ __shared__ volatile HYPRE_Int s_HashKeys[NUM_WARPS_PER_BLOCK * SHMEM_HASH_SIZE]; __shared__ volatile HYPRE_Complex s_HashVals[NUM_WARPS_PER_BLOCK * SHMEM_HASH_SIZE]; /* shared memory hash table for this warp */ volatile HYPRE_Int *warp_s_HashKeys = s_HashKeys + warp_id * SHMEM_HASH_SIZE; volatile HYPRE_Complex *warp_s_HashVals = s_HashVals + warp_id * SHMEM_HASH_SIZE; #if DEBUG_MODE assert(blockDim.z == NUM_WARPS_PER_BLOCK); assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif /* a warp working on the ith row */ for (HYPRE_Int i = grid_warp_id; i < M; i += num_warps) { /* start/end position of global memory hash table */ HYPRE_Int j = -1, istart_g, iend_g, ghash_size, jsum; if (lane_id < 2) { j = read_only_load(ig + grid_warp_id + lane_id); } istart_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); iend_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); /* 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 warp's shared and global memory hash table */ #pragma unrolll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { warp_s_HashKeys[k] = -1; warp_s_HashVals[k] = 0.0; } #pragma unrolll for (HYPRE_Int k = lane_id; k < ghash_size; k += HYPRE_WARP_SIZE) { jg[istart_g+k] = -1; ag[istart_g+k] = 0.0; } __syncwarp(); /* work with two hash tables. jsum is the (exact) nnz for row i */ jsum = csr_spmm_compute_row_numer(i, lane_id, ia, ja, aa, ib, jb, ab, SHMEM_HASH_SIZE, warp_s_HashKeys, warp_s_HashVals, ghash_size, jg + istart_g, ag + istart_g); if (FAILED_SYMBL) { /* in the case when symb mult was failed, save row nnz into rc */ /* num of nonzeros of this row of C (exact) */ jsum = warp_reduce_sum(jsum); if (lane_id == 0) { rc[i] = jsum; } } /* copy results into the final C */ /* start/end position in C */ #if DEBUG_MODE if (lane_id < 2) { j = read_only_load(ic + i + lane_id); } HYPRE_Int istart_c = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); HYPRE_Int iend_c = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); #else if (lane_id < 1) { j = read_only_load(ic + i); } HYPRE_Int istart_c = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); #endif j = copy_from_hash_into_C_row (lane_id, warp_s_HashKeys, warp_s_HashVals, ghash_size, jg + istart_g, ag + istart_g, jc + istart_c, ac + istart_c); #if DEBUG_MODE if (FAILED_SYMBL) { assert(istart_c + j <= iend_c); } else { assert(istart_c + j == iend_c); } #endif } } template __global__ void copy_from_Cext_into_C(HYPRE_Int M, HYPRE_Int *ix, HYPRE_Int *jx, HYPRE_Complex *ax, HYPRE_Int *ic, HYPRE_Int *jc, HYPRE_Complex *ac) { const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ const HYPRE_Int warp_id = get_warp_id(); /* lane id inside the warp */ volatile const HYPRE_Int lane_id = get_lane_id(); #if DEBUG_MODE 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 kc, kx; /* start/end position in C and X*/ if (lane_id < 2) { kc = read_only_load(ic + i + lane_id); kx = read_only_load(ix + i + lane_id); } HYPRE_Int istart_c = __shfl_sync(HYPRE_WARP_FULL_MASK, kc, 0); HYPRE_Int iend_c = __shfl_sync(HYPRE_WARP_FULL_MASK, kc, 1); HYPRE_Int istart_x = __shfl_sync(HYPRE_WARP_FULL_MASK, kx, 0); #if DEBUG_MODE HYPRE_Int iend_x = __shfl_sync(HYPRE_WARP_FULL_MASK, kx, 1); assert(iend_c - istart_c <= iend_x - istart_x); #endif HYPRE_Int p = istart_x - istart_c; for (HYPRE_Int k = istart_c + lane_id; k < iend_c; k += HYPRE_WARP_SIZE) { jc[k] = jx[k+p]; ac[k] = ax[k+p]; } } } /* SpGeMM with Rownnz Upper bound */ HYPRE_Int hypreDevice_CSRSpGemmWithRownnzUpperbound(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) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPMM_NUMERIC] -= hypre_MPI_Wtime(); #endif const HYPRE_Int num_warps_per_block = 20; const HYPRE_Int shmem_hash_size = 128; const HYPRE_Int BDIMX = 2; const HYPRE_Int BDIMY = 16; /* 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 HYPRE_Int num_warps = min(m, HYPRE_MAX_NUM_WARPS); dim3 gDim( (num_warps + bDim.z - 1) / bDim.z ); // number of active warps HYPRE_Int num_act_warps = min(bDim.z * gDim.x, m); char hash_type = hypre_handle->spgemm_hash_type; /* --------------------------------------------------------------------------- * build hash table * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ghash_i, *d_ghash_j, ghash_size; HYPRE_Complex *d_ghash_a; csr_spmm_create_hash_table(m, d_rc, NULL, shmem_hash_size, num_act_warps, &d_ghash_i, &d_ghash_j, &d_ghash_a, &ghash_size); /* --------------------------------------------------------------------------- * numerical multiplication: * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ic, *d_jc, nnzC_nume, *d_ic_new = NULL, *d_jc_new = NULL, nnzC_nume_new = -1; HYPRE_Complex *d_c, *d_c_new = NULL; /* if rc contains exact_rownnz: can allocate the final C directly; if rc contains upper bound : it is a temporary space that is more than enough to store C */ csr_spmm_create_ija(m, d_rc, &d_ic, &d_jc, &d_c, &nnzC_nume); if (!exact_rownnz) { d_ic_new = hypre_TAlloc(HYPRE_Int, m+1, HYPRE_MEMORY_DEVICE); } if (hash_type != 'L' && hash_type != 'Q' && hash_type != 'D') { printf("Unrecognized hash type ... [L(inear), Q(uadratic), D(ouble)]\n"); exit(0); } if (exact_rownnz) { if (hash_type == 'L') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } else if (hash_type == 'Q') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } else if (hash_type == 'D') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } } else { if (hash_type == 'L') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } else if (hash_type == 'Q') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } else if (hash_type == 'D') { HYPRE_CUDA_LAUNCH( (csr_spmm_numeric), gDim, bDim, m, /* k, n, */ d_ia, d_ja, d_a, d_ib, d_jb, d_b, d_ic, d_jc, d_c, d_ic_new + 1, d_ghash_i, d_ghash_j, d_ghash_a ); } } if (!exact_rownnz) { /* alloc final C */ csr_spmm_create_ija(m, d_ic_new, &d_jc_new, &d_c_new, &nnzC_nume_new); hypre_assert(nnzC_nume_new <= nnzC_nume); if (nnzC_nume_new < nnzC_nume) { /* copy to the final C */ dim3 gDim( (m + bDim.z - 1) / bDim.z ); HYPRE_CUDA_LAUNCH( (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_nume = nnzC_nume_new; } else { hypre_TFree(d_ic_new, HYPRE_MEMORY_DEVICE); hypre_TFree(d_jc_new, HYPRE_MEMORY_DEVICE); hypre_TFree(d_c_new, HYPRE_MEMORY_DEVICE); } } hypre_TFree(d_ghash_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_j, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_a, HYPRE_MEMORY_DEVICE); *d_ic_out = d_ic; *d_jc_out = d_jc; *d_c_out = d_c; *nnzC = nnzC_nume; #ifdef HYPRE_PROFILE cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPMM_NUMERIC] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device_cusparse.c000066400000000000000000000152041355566575400225720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #if defined(HYPRE_USING_CUDA) HYPRE_Int hypreDevice_CSRSpGemmCusparse(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 *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); cusparseHandle_t cusparsehandle=0; cusparseMatDescr_t descrA=0, descrB=0, descrC=0; /* initialize cusparse library */ HYPRE_CUSPARSE_CALL( cusparseCreate(&cusparsehandle) ); /* create and setup matrix descriptor */ HYPRE_CUSPARSE_CALL( cusparseCreateMatDescr(&descrA) ); HYPRE_CUSPARSE_CALL( cusparseSetMatType(descrA, CUSPARSE_MATRIX_TYPE_GENERAL) ); HYPRE_CUSPARSE_CALL( cusparseSetMatIndexBase(descrA, CUSPARSE_INDEX_BASE_ZERO) ); HYPRE_CUSPARSE_CALL( cusparseCreateMatDescr(&descrB) ); HYPRE_CUSPARSE_CALL( cusparseSetMatType(descrB, CUSPARSE_MATRIX_TYPE_GENERAL) ); HYPRE_CUSPARSE_CALL( cusparseSetMatIndexBase(descrB, CUSPARSE_INDEX_BASE_ZERO) ); HYPRE_CUSPARSE_CALL( cusparseCreateMatDescr(&descrC) ); HYPRE_CUSPARSE_CALL( cusparseSetMatType(descrC, CUSPARSE_MATRIX_TYPE_GENERAL) ); HYPRE_CUSPARSE_CALL( cusparseSetMatIndexBase(descrC, CUSPARSE_INDEX_BASE_ZERO) ); cusparseOperation_t transA = CUSPARSE_OPERATION_NON_TRANSPOSE; cusparseOperation_t transB = CUSPARSE_OPERATION_NON_TRANSPOSE; HYPRE_Int isDoublePrecision = sizeof(HYPRE_Complex) == sizeof(hypre_double); HYPRE_Int isSinglePrecision = sizeof(HYPRE_Complex) == sizeof(hypre_double) / 2; hypre_assert(isDoublePrecision || isSinglePrecision); // Sort A hypre_TMemcpy(d_ja_sorted, d_ja, HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); size_t pBufferSizeInBytes = 0; void *pBuffer = NULL; HYPRE_Int *P = NULL; HYPRE_CUSPARSE_CALL( cusparseXcsrsort_bufferSizeExt(cusparsehandle, m, k, nnzA, d_ia, d_ja_sorted, &pBufferSizeInBytes) ); pBuffer = hypre_TAlloc(char, pBufferSizeInBytes, HYPRE_MEMORY_DEVICE); P = hypre_TAlloc(HYPRE_Int, nnzA, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseCreateIdentityPermutation(cusparsehandle, nnzA, P) ); HYPRE_CUSPARSE_CALL( cusparseXcsrsort(cusparsehandle, m, k, nnzA, descrA, d_ia, d_ja_sorted, P, pBuffer) ); if (isDoublePrecision) { HYPRE_CUSPARSE_CALL( cusparseDgthr(cusparsehandle, nnzA, d_a, d_a_sorted, P, CUSPARSE_INDEX_BASE_ZERO) ); } else if (isSinglePrecision) { HYPRE_CUSPARSE_CALL( cusparseSgthr(cusparsehandle, nnzA, (float *) d_a, (float *) d_a_sorted, P, CUSPARSE_INDEX_BASE_ZERO) ); } hypre_TFree(pBuffer, HYPRE_MEMORY_DEVICE); hypre_TFree(P, HYPRE_MEMORY_DEVICE); // Sort B hypre_TMemcpy(d_jb_sorted, d_jb, HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseXcsrsort_bufferSizeExt(cusparsehandle, k, n, nnzB, d_ib, d_jb_sorted, &pBufferSizeInBytes) ); pBuffer = hypre_TAlloc(char, pBufferSizeInBytes, HYPRE_MEMORY_DEVICE); P = hypre_TAlloc(HYPRE_Int, nnzB, HYPRE_MEMORY_DEVICE); HYPRE_CUSPARSE_CALL( cusparseCreateIdentityPermutation(cusparsehandle, nnzB, P) ); HYPRE_CUSPARSE_CALL( cusparseXcsrsort(cusparsehandle, k, n, nnzB, descrB, d_ib, d_jb_sorted, P, pBuffer) ); if (isDoublePrecision) { HYPRE_CUSPARSE_CALL( cusparseDgthr(cusparsehandle, nnzB, d_b, d_b_sorted, P, CUSPARSE_INDEX_BASE_ZERO) ); } else if (isSinglePrecision) { HYPRE_CUSPARSE_CALL( cusparseSgthr(cusparsehandle, nnzB, (float *) d_b, (float *) d_b_sorted, P, CUSPARSE_INDEX_BASE_ZERO) ); } hypre_TFree(pBuffer, HYPRE_MEMORY_DEVICE); hypre_TFree(P, HYPRE_MEMORY_DEVICE); // 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, descrA, nnzA, d_ia, d_ja_sorted, descrB, nnzB, d_ib, d_jb_sorted, descrC, d_ic, nnzTotalDevHostPtr ) ); 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); if (isDoublePrecision) { HYPRE_CUSPARSE_CALL( cusparseDcsrgemm(cusparsehandle, transA, transB, m, n, k, descrA, nnzA, d_a_sorted, d_ia, d_ja_sorted, descrB, nnzB, d_b_sorted, d_ib, d_jb_sorted, descrC, d_c, d_ic, d_jc) ); } else if (isSinglePrecision) { HYPRE_CUSPARSE_CALL( cusparseScsrgemm(cusparsehandle, transA, transB, m, n, k, descrA, nnzA, (float *) d_a_sorted, d_ia, d_ja_sorted, descrB, nnzB, (float *) d_b_sorted, d_ib, d_jb_sorted, descrC, (float *) d_c, d_ic, d_jc) ); } *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 /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device_rowbound.c000066400000000000000000000273101355566575400226050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #if defined(HYPRE_USING_CUDA) /*- - - - - - - - - - - - - - - - - - - - - - - - - - *- - - - - - - - - - - - - - - - - - - - - - - - - - Symbolic Multiplication *- - - - - - - - - - - - - - - - - - - - - - - - - - *- - - - - - - - - - - - - - - - - - - - - - - - - - */ template static __device__ __forceinline__ HYPRE_Int hash_insert_symbl(HYPRE_Int HashSize, /* capacity of the hash table */ volatile HYPRE_Int *HashKeys, /* assumed to be initialized as all -1's */ HYPRE_Int key, /* assumed to be nonnegative */ HYPRE_Int &count /* increase by 1 if is a new entry */) { #pragma unroll for (HYPRE_Int i = 0; i < HashSize; i++) { HYPRE_Int j; /* 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 */ HYPRE_Int old = atomicCAS((HYPRE_Int*)(HashKeys+j), -1, key); if (old == -1) { count++; return j; } if (old == key) { return j; } } return -1; } template static __device__ __forceinline__ HYPRE_Int csr_spmm_compute_row_symbl(HYPRE_Int rowi, HYPRE_Int lane_id, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Int s_HashSize, volatile HYPRE_Int *s_HashKeys, HYPRE_Int g_HashSize, HYPRE_Int *g_HashKeys, char &failed) { /* 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 = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); const HYPRE_Int iend = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); HYPRE_Int num_new_insert = 0; /* load column idx and values of row i of A */ for (HYPRE_Int i = istart; i < iend; i += blockDim.y) { HYPRE_Int colA = -1; if (threadIdx.x == 0 && i + threadIdx.y < iend) { colA = read_only_load(ja + i + threadIdx.y); } #if 0 //const HYPRE_Int ymask = get_mask<4>(lane_id); // 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 */ const HYPRE_Int rowB = __shfl_sync(HYPRE_WARP_FULL_MASK, colA, 0, blockDim.x); /* open this row of B, collectively */ HYPRE_Int tmp = -1; if (rowB != -1 && threadIdx.x < 2) { tmp = read_only_load(ib+rowB+threadIdx.x); } const HYPRE_Int rowB_start = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 0, blockDim.x); const HYPRE_Int rowB_end = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 1, blockDim.x); for (HYPRE_Int k = rowB_start; k < rowB_end; k += blockDim.x) { if (k + threadIdx.x < rowB_end) { const HYPRE_Int k_idx = read_only_load(jb + k + threadIdx.x); /* first try to insert into shared memory hash table */ HYPRE_Int pos = hash_insert_symbl(s_HashSize, s_HashKeys, k_idx, num_new_insert); if (-1 == pos) { pos = 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 csr_spmm_symbolic(HYPRE_Int M, /* HYPRE_Int K, HYPRE_Int N, */ HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Int *ig, HYPRE_Int *jg, HYPRE_Int *rc, HYPRE_Int *rf) { volatile const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ volatile const HYPRE_Int warp_id = get_warp_id(); /* warp id in the grid */ volatile const HYPRE_Int grid_warp_id = blockIdx.x * NUM_WARPS_PER_BLOCK + warp_id; /* lane id inside the warp */ volatile HYPRE_Int lane_id = get_lane_id(); /* shared memory hash table */ __shared__ volatile HYPRE_Int s_HashKeys[NUM_WARPS_PER_BLOCK * SHMEM_HASH_SIZE]; /* shared memory hash table for this warp */ volatile HYPRE_Int *warp_s_HashKeys = s_HashKeys + warp_id * SHMEM_HASH_SIZE; char failed = 0; #if DEBUG_MODE assert(blockDim.z == NUM_WARPS_PER_BLOCK); assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); assert(NUM_WARPS_PER_BLOCK <= HYPRE_WARP_SIZE); #endif for (HYPRE_Int i = grid_warp_id; i < M; i += num_warps) { HYPRE_Int j; if (ATTEMPT == 2) { if (lane_id == 0) { j = rf[i]; } j = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); if (j == 0) { continue; } } /* start/end position of global memory hash table */ HYPRE_Int istart_g, iend_g, ghash_size; if (lane_id < 2) { j = read_only_load(ig + grid_warp_id + lane_id); } istart_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); iend_g = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); /* 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 warp's shared and global memory hash table */ #pragma unrolll for (HYPRE_Int k = lane_id; k < SHMEM_HASH_SIZE; k += HYPRE_WARP_SIZE) { warp_s_HashKeys[k] = -1; } #pragma unrolll for (HYPRE_Int k = lane_id; k < ghash_size; k += HYPRE_WARP_SIZE) { jg[istart_g+k] = -1; } __syncwarp(); /* work with two hash tables */ j = csr_spmm_compute_row_symbl(i, lane_id, ia, ja, ib, jb, SHMEM_HASH_SIZE, warp_s_HashKeys, ghash_size, jg + istart_g, failed); #if DEBUG_MODE if (ATTEMPT == 2) { assert(failed == 0); } #endif /* num of nonzeros of this row (an upper bound) */ j = warp_reduce_sum(j); /* if this row failed */ if (ATTEMPT == 1) { failed = warp_reduce_sum(failed); } if (lane_id == 0) { rc[i] = j; if (ATTEMPT == 1) { rf[i] = failed > 0; } #if DEBUG_MODE else { rf[i] = failed > 0; } #endif } } } template void gpu_csr_spmm_rownnz_attempt(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 *d_rf) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPMM_SYMBOLIC] -= hypre_MPI_Wtime(); #endif const HYPRE_Int num_warps_per_block = 20; const HYPRE_Int shmem_hash_size = 256;//512; const HYPRE_Int BDIMX = 2; const HYPRE_Int BDIMY = 16; /* CUDA kernel configurations */ dim3 bDim(BDIMX, BDIMY, num_warps_per_block); assert(bDim.x * bDim.y == HYPRE_WARP_SIZE); // for cases where one WARP works on a row HYPRE_Int num_warps = min(m, HYPRE_MAX_NUM_WARPS); dim3 gDim( (num_warps + bDim.z - 1) / bDim.z ); // number of active warps HYPRE_Int num_act_warps = min(bDim.z * gDim.x, m); char hash_type = hypre_handle->spgemm_hash_type; /* --------------------------------------------------------------------------- * build hash table (no values) * ---------------------------------------------------------------------------*/ HYPRE_Int *d_ghash_i, *d_ghash_j, ghash_size, *d_act; if (ATTEMPT == 1) { d_act = NULL; /* all rows are active */ } else { d_act = d_rf; } csr_spmm_create_hash_table(m, d_rc, d_act, shmem_hash_size, num_act_warps, &d_ghash_i, &d_ghash_j, NULL, &ghash_size); /* --------------------------------------------------------------------------- * symbolic multiplication: * On output, it provides an upper bound of nnz in rows of C * ---------------------------------------------------------------------------*/ if (hash_type == 'L') { HYPRE_CUDA_LAUNCH( (csr_spmm_symbolic), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } else if (hash_type == 'Q') { HYPRE_CUDA_LAUNCH( (csr_spmm_symbolic), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } else if (hash_type == 'D') { HYPRE_CUDA_LAUNCH( (csr_spmm_symbolic), gDim, bDim, m, /*k, n,*/ d_ia, d_ja, d_ib, d_jb, d_ghash_i, d_ghash_j, d_rc, d_rf ); } else { printf("Unrecognized hash type ... [L(inear), Q(uadratic), D(ouble)]\n"); exit(0); } hypre_TFree(d_ghash_i, HYPRE_MEMORY_DEVICE); hypre_TFree(d_ghash_j, HYPRE_MEMORY_DEVICE); #ifdef HYPRE_PROFILE cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPMM_SYMBOLIC] += hypre_MPI_Wtime(); #endif } 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 *d_rc, HYPRE_Int *d_rf) { gpu_csr_spmm_rownnz_attempt<1> (m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, d_rf); return hypre_error_flag; } HYPRE_Int hypreDevice_CSRSpGemmRownnz(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) { /* a binary array to indicate if row nnz counting is failed for a row */ HYPRE_Int *d_rf = hypre_TAlloc(HYPRE_Int, m, HYPRE_MEMORY_DEVICE); gpu_csr_spmm_rownnz_attempt<1> (m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, d_rf); /* row nnz is exact if no row failed */ HYPRE_Int rownnz_exact = hypreDevice_IntegerReduceSum(m, d_rf); printf("^^^^num of failed rows %d (%.2f)\n", rownnz_exact, rownnz_exact/(m+0.0)); if (rownnz_exact != 0) { gpu_csr_spmm_rownnz_attempt<2> (m, k, n, d_ia, d_ja, d_ib, d_jb, d_rc, d_rf); #if DEBUG_MODE assert(hypreDevice_IntegerReduceSum(m, d_rf) == 0); #endif } hypre_TFree(d_rf, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device_rowest.c000066400000000000000000000304031355566575400222660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_CUDA) /*- - - - - - - - - - - - - - - - - - - - - - - - - - * NAIVE *- - - - - - - - - - - - - - - - - - - - - - - - - - */ template static __device__ __forceinline__ void rownnz_naive_rowi(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 = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); const HYPRE_Int iend = __shfl_sync(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') { row_nnz_max = max(row_nnz_max, rowB_end - rowB_start); } } } } template __global__ void csr_spmm_rownnz_naive(HYPRE_Int M, /*HYPRE_Int K,*/ HYPRE_Int N, HYPRE_Int *ia, HYPRE_Int *ja, HYPRE_Int *ib, HYPRE_Int *jb, HYPRE_Int *rcL, HYPRE_Int *rcU) { const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ const HYPRE_Int warp_id = get_warp_id(); /* lane id inside the warp */ volatile const HYPRE_Int lane_id = get_lane_id(); #if DEBUG_MODE 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; rownnz_naive_rowi(i, lane_id, ia, ja, ib, jU, jL); if (type == 'U' || type == 'B') { jU = warp_reduce_sum(jU); jU = min(jU, N); } if (type == 'L' || type == 'B') { jL = warp_reduce_max(jL); } if (lane_id == 0) { if (type == 'L' || type == 'B') { rcL[i] = jL; } if (type == 'U' || type == 'B') { rcU[i] = jU; } } } } /*- - - - - - - - - - - - - - - - - - - - - - - - - - * COHEN *- - - - - - - - - - - - - - - - - - - - - - - - - - */ __global__ void expdistfromuniform(HYPRE_Int n, float *x) { const HYPRE_Int global_thread_id = blockIdx.x * get_block_size() + get_thread_id(); const HYPRE_Int total_num_threads = gridDim.x * get_block_size(); #if DEBUG_MODE 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 cohen_rowest_kernel(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) { const HYPRE_Int num_warps = NUM_WARPS_PER_BLOCK * gridDim.x; /* warp id inside the block */ const HYPRE_Int warp_id = get_warp_id(); /* lane id inside the warp */ volatile HYPRE_Int lane_id = get_lane_id(); #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 DEBUG_MODE assert(blockDim.z == NUM_WARPS_PER_BLOCK); assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); assert(sizeof(T) == sizeof(float)); #endif 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 = __shfl_sync(HYPRE_WARP_FULL_MASK, tmp, 0); const HYPRE_Int iend = __shfl_sync(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 = __shfl_sync(HYPRE_WARP_FULL_MASK, col, k); if (colk == -1) { #if DEBUG_MODE assert(j + HYPRE_WARP_SIZE >= iend); #endif break; } if (r + lane_id < nsamples) { T val = read_only_load(V_in + r + lane_id + colk * nsamples); vmin = min(vmin, val); } } } 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(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) { len = max(low[i], len); } if (upp) { len = min(upp[i], len); } if (rc) { rc[i] = len; } } } } /* for (i = ...) */ } template void csr_spmm_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) { dim3 bDim(BDIMX, BDIMY, NUM_WARPS_PER_BLOCK); assert(bDim.x * bDim.y == HYPRE_WARP_SIZE); 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); curandGenerator_t gen = hypre_HandleCurandGenerator(hypre_handle); //CURAND_CALL(curandSetGeneratorOrdering(gen, CURAND_ORDERING_PSEUDO_SEEDED)); /* random V1: uniform --> exp */ HYPRE_CURAND_CALL(curandGenerateUniform(gen, d_V1, nsamples * N)); // CURAND_CALL(curandGenerateUniformDouble(gen, d_V1, nsamples * N)); dim3 gDim( (nsamples * N + bDim.z * HYPRE_WARP_SIZE - 1) / (bDim.z * HYPRE_WARP_SIZE) ); HYPRE_CUDA_LAUNCH( expdistfromuniform, gDim, bDim, nsamples * N, d_V1 ); /* step-1: layer 3-2 */ gDim.x = (K + bDim.z - 1) / bDim.z; HYPRE_CUDA_LAUNCH( (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; gDim.x = (M + bDim.z - 1) / bDim.z; HYPRE_CUDA_LAUNCH( (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) { #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_SPMM_ROWNNZ] -= hypre_MPI_Wtime(); #endif const HYPRE_Int num_warps_per_block = 16; const HYPRE_Int shmem_size_per_warp = 128; const HYPRE_Int BDIMX = 2; const HYPRE_Int BDIMY = 16; /* CUDA kernel configurations */ dim3 bDim(BDIMX, BDIMY, num_warps_per_block); 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 ); HYPRE_Int row_est_mtd = hypre_handle->spgemm_rownnz_estimate_method; HYPRE_Int cohen_nsamples = hypre_handle->spgemm_rownnz_estimate_nsamples; float cohen_mult = hypre_handle->spgemm_rownnz_estimate_mult_factor; if (row_est_mtd == 1) { /* naive overestimate */ HYPRE_CUDA_LAUNCH( (csr_spmm_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_CUDA_LAUNCH( (csr_spmm_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_CUDA_LAUNCH( (csr_spmm_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 */ csr_spmm_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 { printf("Unknown row nnz estimation method %d! \n", row_est_mtd); exit(-1); } #ifdef HYPRE_PROFILE cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPMM_ROWNNZ] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_spgemm_device_util.c000066400000000000000000000077551355566575400217360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" #if defined(HYPRE_USING_CUDA) /* assume d_i is of length (m+1) and contains the "sizes" in d_i[1], ..., d_i[m] the value of d_i[0] is not assumed */ void csr_spmm_create_ija(HYPRE_Int m, HYPRE_Int *d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz) { cudaMemset(d_i, 0, sizeof(HYPRE_Int)); /* make ghash pointers by prefix scan */ HYPRE_THRUST_CALL(inclusive_scan, d_i, d_i + m + 1, d_i); /* total size */ cudaMemcpy(nnz, d_i + m, sizeof(HYPRE_Int), cudaMemcpyDeviceToHost); 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 "sizes" */ void csr_spmm_create_ija(HYPRE_Int m, HYPRE_Int *d_c, HYPRE_Int **d_i, HYPRE_Int **d_j, HYPRE_Complex **d_a, HYPRE_Int *nnz) { *d_i = hypre_TAlloc(HYPRE_Int, m+1, HYPRE_MEMORY_DEVICE); cudaMemset(*d_i, 0, sizeof(HYPRE_Int)); /* make ghash pointers by prefix scan */ HYPRE_THRUST_CALL(inclusive_scan, d_c, d_c + m, *d_i + 1); /* total size */ cudaMemcpy(nnz, (*d_i) + m, sizeof(HYPRE_Int), cudaMemcpyDeviceToHost); 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 csr_spmm_get_ghash_size(HYPRE_Int n, HYPRE_Int *rc, HYPRE_Int *rf, HYPRE_Int *rg, HYPRE_Int SHMEM_HASH_SIZE) { #if DEBUG_MODE assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif const HYPRE_Int global_thread_id = blockIdx.x * get_block_size() + get_thread_id(); const HYPRE_Int total_num_threads = gridDim.x * get_block_size(); for (HYPRE_Int i = global_thread_id; i < n; i+= total_num_threads) { HYPRE_Int j = (!rf || rf[i]) ? next_power_of_2(rc[i] - SHMEM_HASH_SIZE) : 0; rg[i] = j; } } __global__ void csr_spmm_get_ghash_size(HYPRE_Int n, HYPRE_Int num_ghash, HYPRE_Int *rc, HYPRE_Int *rf, HYPRE_Int *rg, HYPRE_Int SHMEM_HASH_SIZE) { #if DEBUG_MODE assert(blockDim.x * blockDim.y == HYPRE_WARP_SIZE); #endif const HYPRE_Int global_thread_id = blockIdx.x * get_block_size() + get_thread_id(); const HYPRE_Int total_num_threads = gridDim.x * get_block_size(); for (HYPRE_Int i = global_thread_id; i < n; i+= total_num_threads) { HYPRE_Int j = (!rf || rf[i]) ? next_power_of_2(rc[i] - SHMEM_HASH_SIZE) : 0; if (j) { atomicMax(&rg[i % num_ghash], j); } } } HYPRE_Int csr_spmm_create_hash_table(HYPRE_Int m, HYPRE_Int *d_rc, HYPRE_Int *d_rf, HYPRE_Int SHMEM_HASH_SIZE, HYPRE_Int num_ghash, HYPRE_Int **d_ghash_i, HYPRE_Int **d_ghash_j, HYPRE_Complex **d_ghash_a, HYPRE_Int *ghash_size) { const HYPRE_Int num_warps_per_block = 20; const HYPRE_Int BDIMX = 4; const HYPRE_Int BDIMY = 8; dim3 bDim(BDIMX, BDIMY, num_warps_per_block); dim3 gDim( (m + bDim.z * HYPRE_WARP_SIZE - 1) / (bDim.z * HYPRE_WARP_SIZE) ); assert(num_ghash <= m); *d_ghash_i = hypre_TAlloc(HYPRE_Int, num_ghash + 1, HYPRE_MEMORY_DEVICE); if (num_ghash == m) { HYPRE_CUDA_LAUNCH( csr_spmm_get_ghash_size, gDim, bDim, m, d_rc, d_rf, (*d_ghash_i) + 1, SHMEM_HASH_SIZE ); } else { cudaMemset(*d_ghash_i, 0, (num_ghash + 1) * sizeof(HYPRE_Int)); HYPRE_CUDA_LAUNCH( csr_spmm_get_ghash_size, gDim, bDim, m, num_ghash, d_rc, d_rf, (*d_ghash_i) + 1, SHMEM_HASH_SIZE ); } csr_spmm_create_ija(num_ghash, *d_ghash_i, d_ghash_j, d_ghash_a, ghash_size); return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/csr_sptrans_device.c000066400000000000000000000056431355566575400210750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_CUDA) 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) { /* trivial case */ if (nnzA == 0) { *d_ic_out = hypre_CTAlloc(HYPRE_Int, n + 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); return hypre_error_flag; } #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, 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); #if DEBUG_MODE 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 cudaThreadSynchronize(); hypre_profile_times[HYPRE_TIMER_ID_SPTRANS] += hypre_MPI_Wtime(); #endif return hypre_error_flag; } #endif /* HYPRE_USING_CUDA */ hypre-2.18.2/src/seq_mv/genpart.c000066400000000000000000000044371355566575400166550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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*/ HYPRE_Int hypre_GenerateLocalPartitioning(HYPRE_BigInt length, HYPRE_Int num_procs, HYPRE_Int myid, HYPRE_BigInt **part_ptr) { HYPRE_Int ierr = 0; HYPRE_BigInt *part; HYPRE_Int size, rest; part = hypre_CTAlloc(HYPRE_BigInt, 2, HYPRE_MEMORY_HOST); 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; *part_ptr = part; return ierr; } hypre-2.18.2/src/seq_mv/headers000077500000000000000000000025041355566575400164030ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <<@ #include #include "HYPRE_seq_mv.h" #ifndef hypre_MV_HEADER #define hypre_MV_HEADER #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 gpukernel.h >> $INTERNAL_HEADER ../utilities/protos *.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/seq_mv/mapped_matrix.c000066400000000000000000000113661355566575400200460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( ) { 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; 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_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.18.2/src/seq_mv/mapped_matrix.h000066400000000000000000000030171355566575400200450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/seq_mv/multiblock_matrix.c000066400000000000000000000120461355566575400207410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( ) { 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; return(ierr); } /*-------------------------------------------------------------------------- * hypre_MultiblockMatrixPrint *--------------------------------------------------------------------------*/ void hypre_MultiblockMatrixPrint(hypre_MultiblockMatrix *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.18.2/src/seq_mv/multiblock_matrix.h000066400000000000000000000032471355566575400207510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/seq_mv/seq_mv.h000066400000000000000000000525011355566575400165070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_MV_HEADER #define hypre_MV_HEADER #include #include #include #include #include "HYPRE_seq_mv.h" #include "_hypre_utilities.h" #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * 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 /*-------------------------------------------------------------------------- * 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; /* Does the CSRMatrix create/destroy `data', `i', `j'? */ HYPRE_Int owns_data; HYPRE_Complex *data; /* for compressing rows in matrix multiplication */ HYPRE_Int *rownnz; HYPRE_Int num_rownnz; /* memory location of arrays i, j, data */ HYPRE_Int memory_location; //#ifdef HYPRE_BIGINT // hypre_int *i_short, *j_short; //#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_CSRMatrixMemoryLocation(matrix) ((matrix) -> memory_location) 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 /****************************************************************************** * * 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 /****************************************************************************** * * 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 /****************************************************************************** * * Header info for Vector data structure * *****************************************************************************/ #ifndef hypre_VECTOR_HEADER #define hypre_VECTOR_HEADER /*-------------------------------------------------------------------------- * hypre_Vector *--------------------------------------------------------------------------*/ typedef struct { HYPRE_Complex *data; HYPRE_Int size; /* Does the Vector create/destroy `data'? */ HYPRE_Int owns_data; /* memory location of array data */ HYPRE_Int memory_location; /* 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_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 ) #endif /* csr_matop.c */ hypre_CSRMatrix *hypre_CSRMatrixAddHost ( hypre_CSRMatrix *A , hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixAdd ( hypre_CSRMatrix *A , 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); /* csr_matop_device.c */ #if defined(HYPRE_USING_CUDA) hypre_CSRMatrix *hypre_CSRMatrixAddDevice ( hypre_CSRMatrix *A , hypre_CSRMatrix *B ); hypre_CSRMatrix *hypre_CSRMatrixMultiplyDevice ( hypre_CSRMatrix *A , hypre_CSRMatrix *B ); 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 ); #endif /* 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_Int 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_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_CSRMatrixPrint2( hypre_CSRMatrix *matrix, const char *file_name ); 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_CSRMatrix *hypre_CSRMatrixClone ( hypre_CSRMatrix *A, HYPRE_Int copy_data ); hypre_CSRMatrix *hypre_CSRMatrixClone_v2( hypre_CSRMatrix *A, HYPRE_Int copy_data, HYPRE_Int memory_location ); 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_Int to_location); //hypre_int hypre_CSRMatrixIsManaged(hypre_CSRMatrix *a); /* 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 ); HYPRE_Int hypre_CSRMatrixMatvecOutOfPlaceOOMP (HYPRE_Int trans, 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 ); #ifdef HYPRE_USING_CUDA 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_CSRMatrixMatvecDeviceBIGINT( HYPRE_Complex alpha , hypre_CSRMatrix *A , hypre_Vector *x , HYPRE_Complex beta , hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset ); #endif /* 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_ptr ); /* 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_SeqVectorInitialize_v2( hypre_Vector *vector, HYPRE_Int memory_location ); HYPRE_Int hypre_SeqVectorInitialize ( hypre_Vector *vector ); HYPRE_Int hypre_SeqVectorSetDataOwner ( hypre_Vector *vector , HYPRE_Int owns_data ); 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_SeqVectorSetRandomValues ( hypre_Vector *v , HYPRE_Int seed ); HYPRE_Int hypre_SeqVectorCopy ( hypre_Vector *x , hypre_Vector *y ); hypre_Vector *hypre_SeqVectorCloneDeep ( hypre_Vector *x ); hypre_Vector *hypre_SeqVectorCloneShallow ( hypre_Vector *x ); HYPRE_Int hypre_SeqVectorScale( HYPRE_Complex alpha, hypre_Vector *y ); HYPRE_Int hypre_SeqVectorAxpy ( HYPRE_Complex alpha , hypre_Vector *x , hypre_Vector *y ); HYPRE_Real hypre_SeqVectorInnerProd ( 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_Int hypre_SeqVectorPrefetch(hypre_Vector *x, HYPRE_Int to_location); //hypre_int hypre_SeqVectorIsManaged(hypre_Vector *x); //HYPRE_Int hypre_CSRMatrixMatvecOutOfPlaceOOMP3( HYPRE_Complex alpha, hypre_CSRMatrix *A, hypre_Vector *x, HYPRE_Complex beta, hypre_Vector *b, hypre_Vector *y, HYPRE_Int offset); #if defined(HYPRE_USING_CUDA) HYPRE_Int hypreDevice_CSRSpAdd(HYPRE_Int ma, HYPRE_Int mb, HYPRE_Int n, HYPRE_Int nnzA, HYPRE_Int nnzB, HYPRE_Int *d_ia, HYPRE_Int *d_ja, HYPRE_Complex *d_aa, HYPRE_Int *d_ib, HYPRE_Int *d_jb, HYPRE_Complex *d_ab, 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_CSRSpGemm(HYPRE_Int m, HYPRE_Int k, HYPRE_Int n, HYPRE_Int nnza, HYPRE_Int nnzb, 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_ic_out, HYPRE_Int **d_jc_out, HYPRE_Complex **d_c_out, HYPRE_Int *nnzC); #endif #ifdef __cplusplus } #endif #endif /* #ifndef hypre_MV_HEADER */ hypre-2.18.2/src/seq_mv/vector.c000066400000000000000000000432201355566575400165100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #include /*-------------------------------------------------------------------------- * 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_MEMORY_SHARED; 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 ) { HYPRE_Int ierr=0; if (vector) { HYPRE_Int memory_location = hypre_VectorMemoryLocation(vector); if ( hypre_VectorOwnsData(vector) ) { hypre_TFree(hypre_VectorData(vector), memory_location); } hypre_TFree(vector, HYPRE_MEMORY_HOST); } return ierr; } /*-------------------------------------------------------------------------- * hypre_SeqVectorInitialize *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorInitialize_v2( hypre_Vector *vector, HYPRE_Int memory_location ) { HYPRE_Int size = hypre_VectorSize(vector); HYPRE_Int ierr = 0; HYPRE_Int num_vectors = hypre_VectorNumVectors(vector); HYPRE_Int multivec_storage_method = hypre_VectorMultiVecStorageMethod(vector); 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); } 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 { ++ierr; } return ierr; } HYPRE_Int hypre_SeqVectorInitialize( hypre_Vector *vector ) { HYPRE_Int ierr; ierr = hypre_SeqVectorInitialize_v2( vector, hypre_VectorMemoryLocation(vector) ); return ierr; } /*-------------------------------------------------------------------------- * hypre_SeqVectorSetDataOwner *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SeqVectorSetDataOwner( hypre_Vector *vector, HYPRE_Int owns_data ) { HYPRE_Int ierr=0; hypre_VectorOwnsData(vector) = owns_data; return ierr; } /*-------------------------------------------------------------------------- * ReadVector *--------------------------------------------------------------------------*/ 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_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; HYPRE_Int ierr = 0; 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 size_y) { size = size_y; } size *= hypre_VectorNumVectors(x); #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( cublasDcopy(hypre_HandleCublasHandle(hypre_handle), size, x_data, 1, y_data, 1) ); #else HYPRE_THRUST_CALL( copy_n, x_data, size, y_data ); #endif #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] = x_data[i]; } #endif /* defined(HYPRE_USING_CUDA) */ hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return ierr; } /*-------------------------------------------------------------------------- * 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 ) { 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(y); hypre_SeqVectorCopy( x, y ); return y; } /*-------------------------------------------------------------------------- * 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_VectorData(y) = hypre_VectorData(x); hypre_SeqVectorSetDataOwner( y, 0 ); hypre_SeqVectorInitialize(y); return y; } /*-------------------------------------------------------------------------- * 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 HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(y); HYPRE_Int ierr = 0; size *= hypre_VectorNumVectors(y); hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( cublasDscal(hypre_HandleCublasHandle(hypre_handle), size, &alpha, y_data, 1) ); #else HYPRE_THRUST_CALL( transform, y_data, y_data + size, y_data, alpha * _1 ); #endif #else HYPRE_Int i; #if defined(HYPRE_USING_DEVICE_OPENMP) #pragma omp target teams distribute parallel for private(i) is_device_ptr(y_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] *= alpha; } #endif /* defined(HYPRE_USING_CUDA) */ hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return ierr; } /*-------------------------------------------------------------------------- * 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 HYPRE_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Int ierr = 0; size *= hypre_VectorNumVectors(x); hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_CUDA) #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( cublasDaxpy(hypre_HandleCublasHandle(hypre_handle), size, &alpha, x_data, 1, y_data, 1) ); #else HYPRE_THRUST_CALL( transform, x_data, x_data + size, y_data, y_data, alpha * _1 + _2 ); #endif #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] += alpha * x_data[i]; } #endif /* defined(HYPRE_USING_CUDA) */ hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return ierr; } /*-------------------------------------------------------------------------- * 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_Complex *x_data = hypre_VectorData(x); HYPRE_Complex *y_data = hypre_VectorData(y); HYPRE_Int size = hypre_VectorSize(x); HYPRE_Real result = 0.0; size *= hypre_VectorNumVectors(x); hypre_SeqVectorPrefetch(x, HYPRE_MEMORY_DEVICE); hypre_SeqVectorPrefetch(y, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_CUDA) #ifndef HYPRE_COMPLEX #if defined(HYPRE_USING_CUBLAS) HYPRE_CUBLAS_CALL( cublasDdot(hypre_HandleCublasHandle(hypre_handle), size, x_data, 1, y_data, 1, &result) ); #else result = HYPRE_THRUST_CALL( inner_product, x_data, x_data + size, y_data, 0.0 ); #endif #else /* TODO */ #error "Complex inner product" #endif #else /* #if defined(HYPRE_USING_CUDA) */ HYPRE_Int i; #if defined(HYPRE_USING_DEVICE_OPENMP) #pragma omp target teams distribute parallel for private(i) reduction(+:result) is_device_ptr(y_data,x_data) map(result) #elif defined(HYPRE_USING_OPENMP) #pragma omp parallel for private(i) reduction(+:result) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < size; i++) { result += hypre_conj(y_data[i]) * x_data[i]; } #endif /* defined(HYPRE_USING_CUDA) */ hypre_SyncCudaComputeStream(hypre_handle); #ifdef HYPRE_PROFILE hypre_profile_times[HYPRE_TIMER_ID_BLAS1] += hypre_MPI_Wtime(); #endif return result; } //TODO /*-------------------------------------------------------------------------- * hypre_VectorSumElts: * Returns the sum of all vector elements. *--------------------------------------------------------------------------*/ HYPRE_Complex hypre_SeqVectorSumElts( hypre_Vector *vector ) { HYPRE_Complex sum = 0; HYPRE_Complex *data = hypre_VectorData( vector ); HYPRE_Int size = hypre_VectorSize( vector ); HYPRE_Int i; #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) reduction(+:sum) HYPRE_SMP_SCHEDULE #endif for ( i=0; i data) #define hypre_VectorSize(vector) ((vector) -> size) #define hypre_VectorOwnsData(vector) ((vector) -> owns_data) #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 ) #endif hypre-2.18.2/src/seq_mv/vector_batched.c000066400000000000000000001075011355566575400201650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 = result_x[j]; res_y = 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.18.2/src/sstruct_ls/000077500000000000000000000000001355566575400157545ustar00rootroot00000000000000hypre-2.18.2/src/sstruct_ls/CMakeLists.txt000066400000000000000000000035111355566575400205140ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 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 hypre_bsearch.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_TV.c maxwell_TV_setup.c maxwell_zeroBC.c hypre_MaxwellSolve.c hypre_MaxwellSolve2.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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/sstruct_ls/F90_HYPRE_sstruct_InterFAC.c000066400000000000000000000342521355566575400226750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_bicgstab.c000066400000000000000000000236561355566575400230660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_flexgmres.c000066400000000000000000000237601355566575400233000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_gmres.c000066400000000000000000000243601355566575400224160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_int.c000066400000000000000000000060511355566575400220700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_lgmres.c000066400000000000000000000244701355566575400225740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_maxwell.c000066400000000000000000000315111355566575400227460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_pcg.c000066400000000000000000000257521355566575400220600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_split.c000066400000000000000000000146711355566575400224400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/F90_HYPRE_sstruct_sys_pfmg.c000066400000000000000000000255661355566575400231410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/HYPRE_sstruct_InterFAC.c000066400000000000000000000266531355566575400222650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/HYPRE_sstruct_bicgstab.c000066400000000000000000000164421355566575400224430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/sstruct_ls/HYPRE_sstruct_flexgmres.c000066400000000000000000000175301355566575400226600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_FlexGMRESFunctions * fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/sstruct_ls/HYPRE_sstruct_gmres.c000066400000000000000000000166231355566575400220030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_GMRESFunctions * gmres_functions = hypre_GMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/sstruct_ls/HYPRE_sstruct_int.c000066400000000000000000000062201355566575400214500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/HYPRE_sstruct_lgmres.c000066400000000000000000000166551355566575400221640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_LGMRESFunctions * lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/sstruct_ls/HYPRE_sstruct_ls.h000066400000000000000000001175441355566575400213150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct Solvers * * These solvers use matrix/vector storage schemes that are taylored * to semi-structured grid problems. * * @memo Linear solvers for semi-structured grids **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 */ #ifndef HYPRE_SOLVER_STRUCT #define HYPRE_SOLVER_STRUCT struct hypre_Solver_struct; typedef struct hypre_Solver_struct *HYPRE_Solver; #endif 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 {\tt b} and {\tt 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 {\tt SetZeroGuess}. **/ HYPRE_Int HYPRE_SStructSysPFMGSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set relaxation type. * * Current relaxation methods set by {\tt relax\_type} are: * * \begin{tabular}{l@{ -- }l} * 0 & Jacobi \\ * 1 & Weighted Jacobi (default) \\ * 2 & Red/Black Gauss-Seidel (symmetric: RB pre-relaxation, BR post-relaxation) \\ * \end{tabular} **/ 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 {\tt b} and {\tt 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 {\tt SetZeroGuess}. **/ HYPRE_Int HYPRE_SStructSplitSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set up the type of diagonal struct solver. Either {\tt ssolver} is * set to {\tt HYPRE\_SMG} or {\tt 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 {\tt SetZeroGuess}. **/ HYPRE_Int HYPRE_SStructFACSetNonZeroGuess(HYPRE_SStructSolver solver); /** * (Optional) Set relaxation type. See \Ref{HYPRE_SStructSysPFMGSetRelaxType} * for appropriate values of {\tt 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 {\tt csolver\_type} are: * * \begin{tabular}{l@{ -- }l} * 1 & SysPFMG-PCG (default) \\ * 2 & SysPFMG \\ * \end{tabular} **/ 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 {\tt b} and {\tt 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[HYPRE_MAXDIM]); /** * 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_MAXDIM], 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{PCG Solver}. **/ /*@{*/ /** * 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{GMRES Solver}. **/ /*@{*/ /** * 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{FlexGMRES Solver}. **/ /*@{*/ /** * 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{LGMRES Solver}. **/ /*@{*/ /** * 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{BiCGSTAB Solver}. **/ /*@{*/ /** * 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* These includes shouldn't be here. (RDF) */ #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "_hypre_sstruct_mv.h" /** * @name SStruct LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \Ref{LOBPCG Eigensolver}. **/ /*@{*/ /** * 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); /* The next routines should not be here (lower-case prefix). (RDF) */ /* * Set hypre_SStructPVector to random values. **/ HYPRE_Int hypre_SStructPVectorSetRandomValues(hypre_SStructPVector *pvector, HYPRE_Int seed); /* * Set hypre_SStructVector to random values. **/ HYPRE_Int hypre_SStructVectorSetRandomValues(hypre_SStructVector *vector, HYPRE_Int seed); /* * Same as hypre_SStructVectorSetRandomValues except uses void pointer. **/ HYPRE_Int hypre_SStructSetRandomValues(void *v, HYPRE_Int seed); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*@}*/ #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/sstruct_ls/HYPRE_sstruct_maxwell.c000066400000000000000000000300611355566575400223270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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[3] ) { 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[3], 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.18.2/src/sstruct_ls/HYPRE_sstruct_pcg.c000066400000000000000000000216541355566575400214370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_PCGFunctions * pcg_functions = hypre_PCGFunctionsCreate( hypre_CAlloc, 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.18.2/src/sstruct_ls/HYPRE_sstruct_split.c000066400000000000000000000444251355566575400220220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 struct hypre_SStructSolver_struct { hypre_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_Int (***ssolver_solve)(); HYPRE_Int (***ssolver_destroy)(); 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_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_Int (***ssolver_solve)(); HYPRE_Int (***ssolver_destroy)(); void ***ssolver_data; HYPRE_Int (*sdestroy)(void *); 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 = (HYPRE_Int (*)(void *))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_SStructVector *y; HYPRE_Int nparts; HYPRE_Int *nvars; void ****smatvec_data; HYPRE_Int (***ssolver_solve)(); HYPRE_Int (***ssolver_destroy)(); void ***ssolver_data; HYPRE_Int ssolver = (solver -> ssolver); 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_Int (*ssolve)(); HYPRE_Int (*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_Int (***)()) hypre_MAlloc((sizeof(HYPRE_Int (**)()) * nparts), HYPRE_MEMORY_HOST); ssolver_destroy = (HYPRE_Int (***)()) hypre_MAlloc((sizeof(HYPRE_Int (**)()) * 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_Int (**)()) hypre_MAlloc((sizeof(HYPRE_Int (*)()) * nvars[part]), HYPRE_MEMORY_HOST); ssolver_destroy[part] = (HYPRE_Int (**)()) hypre_MAlloc((sizeof(HYPRE_Int (*)()) * 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); } /* don't break */ 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_Int (*)())HYPRE_StructJacobiSolve; sdestroy = (HYPRE_Int (*)())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_Int (*)())HYPRE_StructSMGSolve; sdestroy = (HYPRE_Int (*)())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_Int (*)())HYPRE_StructPFMGSolve; sdestroy = (HYPRE_Int (*)())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_Int (***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_Int (*ssolve)(void*, hypre_StructMatrix*,hypre_StructVector*,hypre_StructVector*); 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) = 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 = (HYPRE_Int (*)(void *, hypre_StructMatrix *, hypre_StructVector *, hypre_StructVector *))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, sA, sy, 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.18.2/src/sstruct_ls/HYPRE_sstruct_sys_pfmg.c000066400000000000000000000172151355566575400225130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/Makefile000066400000000000000000000065121355566575400174200ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../parcsr_mv\ -I$(srcdir)/../IJ_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\ 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\ hypre_bsearch.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_TV.c\ maxwell_TV_setup.c\ maxwell_zeroBC.c\ hypre_MaxwellSolve.c\ hypre_MaxwellSolve2.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 OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/sstruct_ls/_hypre_sstruct_ls.h000066400000000000000000001234471355566575400217130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 ); /* hypre_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 ); /* hypre_MaxwellSolve2.c */ HYPRE_Int hypre_MaxwellSolve2 ( void *maxwell_vdata , hypre_SStructMatrix *A_in , hypre_SStructVector *f , hypre_SStructVector *u ); /* hypre_MaxwellSolve.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_MAXDIM]); 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_MAXDIM], 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 ( HYPRE_Int count , HYPRE_Int elt_size ); 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.18.2/src/sstruct_ls/eliminate_rowscols.c000066400000000000000000000165261355566575400220340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/eliminate_rowscols.h000066400000000000000000000041751355566575400220360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/fac.c000066400000000000000000000325021355566575400166530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/fac.h000066400000000000000000000060301355566575400166550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/fac_CFInterfaceExtents.c000066400000000000000000000155711355566575400224260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/fac_amr_fcoarsen.c000066400000000000000000005002621355566575400213750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "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, 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, *rank_stencils; HYPRE_Int *stencil_contrib_cnt; HYPRE_Int **stencil_contrib_i; HYPRE_Real **weight_contrib_i; HYPRE_Real weights[4]= {1.0, 0.25, 0.125, 0.0625}; HYPRE_Real sum; HYPRE_Int abs_stencil_shape; hypre_Box **shift_box; hypre_Box coarse_cell_box; HYPRE_Int volume_coarse_cell_box; HYPRE_Int *volume_shift_box; HYPRE_Int max_contribut_size, stencil_i; HYPRE_BigInt startrank, rank; HYPRE_Real *vals, *vals2; 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); /*-------------------------------------------------------------------------- * 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); } if (graph_type == HYPRE_PARCSR) { startrank = hypre_SStructGridStartRank(grid); } /*-------------------------------------------------------------------------- * 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); { hypre_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]); 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.18.2/src/sstruct_ls/fac_amr_rap.c000066400000000000000000000531511355566575400203570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/sstruct_ls/fac_amr_zero_data.c000066400000000000000000000277651355566575400215610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/fac_cf_coarsen.c000066400000000000000000000540741355566575400210450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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); } if (graph_type == HYPRE_PARCSR) { startrank = hypre_SStructGridStartRank(grid); } /*-------------------------------------------------------------------------- * 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); { hypre_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.18.2/src/sstruct_ls/fac_cfstencil_box.c000066400000000000000000000145121355566575400215560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/fac_interp2.c000066400000000000000000001745251355566575400203320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, kshift; 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, yweight2; HYPRE_Real zweight1, zweight2; /*----------------------------------------------------------------------- * 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_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. *--------------------------------------------------------*/ hypre_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]=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. *--------------------------------------------------------*/ hypre_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.18.2/src/sstruct_ls/fac_relax.c000066400000000000000000000023161355566575400200460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/fac_restrict2.c000066400000000000000000001126741355566575400206650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "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_ClearIndex(stridec); for (i= 0; i< ndim; i++) { stridec[i]= 1; } hypre_CopyIndex(stride, rfactors); for (i= ndim; i< 3; 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. *-----------------------------------------------------------------*/ hypre_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.18.2/src/sstruct_ls/fac_setup2.c000066400000000000000000001143341355566575400201610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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_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.18.2/src/sstruct_ls/fac_solve3.c000066400000000000000000000405001355566575400201430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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.18.2/src/sstruct_ls/fac_zero_cdata.c000066400000000000000000000154561355566575400210570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/fac_zero_stencilcoef.c000066400000000000000000000415521355566575400222750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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_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.18.2/src/sstruct_ls/gselim.h000066400000000000000000000033751355566575400174150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 GSELIM_H #define 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 hypre-2.18.2/src/sstruct_ls/headers000077500000000000000000000031731355566575400173210ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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_ls.h #=========================================================================== # Include guards and other includes #=========================================================================== cat > $INTERNAL_HEADER <<@ #include #include "HYPRE_sstruct_ls.h" #ifndef hypre_SSTRUCT_LS_HEADER #define hypre_SSTRUCT_LS_HEADER #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 @ #=========================================================================== # Structures and prototypes #=========================================================================== cat sstruct_owninfo.h >> $INTERNAL_HEADER cat sstruct_recvinfo.h >> $INTERNAL_HEADER cat sstruct_sendinfo.h >> $INTERNAL_HEADER cat maxwell_PTopology.h >> $INTERNAL_HEADER cat maxwell_TV.h >> $INTERNAL_HEADER cat sstruct_sharedDOFComm.h >> $INTERNAL_HEADER ../utilities/protos [!F]*.c >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/sstruct_ls/hypre_MaxwellSolve.c000066400000000000000000001021251355566575400217520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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; HYPRE_Int ierr= 0; /* 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_ParVectorSetPartitioningOwner(ze,0); } 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 ierr; } /* 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 ierr; } } /*----------------------------------------------------- * 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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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); if (ze) hypre_ParVectorDestroy(ze); return ierr; } hypre-2.18.2/src/sstruct_ls/hypre_MaxwellSolve2.c000066400000000000000000000430521355566575400220370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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, x_dot_x; HYPRE_Int i, j; HYPRE_Int level; HYPRE_Int ierr= 0; /* 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_ParVectorSetPartitioningOwner(ze,0); } 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 ierr; } /* 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 ierr; } } /*----------------------------------------------------- * 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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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); if (ze) hypre_ParVectorDestroy(ze); return ierr; } hypre-2.18.2/src/sstruct_ls/hypre_bsearch.c000066400000000000000000000047051355566575400207440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/krylov.c000066400000000000000000000022651355566575400174530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 ) { return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovIdentity( void *vdata, void *A, void *b, void *x ) { return( hypre_SStructKrylovCopyVector(b, x) ); } hypre-2.18.2/src/sstruct_ls/krylov_sstruct.c000066400000000000000000000216771355566575400212520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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( HYPRE_Int count, HYPRE_Int elt_size ) { return( (void*) hypre_CTAlloc( char, count * elt_size , HYPRE_MEMORY_HOST) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SStructKrylovFree( void *ptr ) { hypre_Free( 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 ) { 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.18.2/src/sstruct_ls/maxwell_PNedelec.c000066400000000000000000004077721355566575400213510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_SetIndex3(zero_index, 0, 0, 0); hypre_SetIndex3(one_index, 0, 0, 0); for (i= 0; i< ndim; i++) { one_index[i]= 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. * 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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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; } } 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_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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.18.2/src/sstruct_ls/maxwell_PNedelec_bdy.c000066400000000000000000000477751355566575400222120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/maxwell_PTopology.h000066400000000000000000000015001355566575400216060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/maxwell_TV.c000066400000000000000000000377331355566575400202170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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[3] ) { 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.18.2/src/sstruct_ls/maxwell_TV.h000066400000000000000000000071041355566575400202110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/maxwell_TV_setup.c000066400000000000000000001663251355566575400214370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; 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, **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, *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; 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_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); /*--------------------------------------------------------------------- * 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); 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); HYPRE_IJMatrixSetValues(Aen, 1, &size, &big_i, (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); HYPRE_IJMatrixSetValues(hypre_SStructMatrixIJMatrix(Ann), 1, &size, &big_i, (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); /* 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); { hypre_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, HYPRE_MEMORY_HOST); ncols= hypre_CTAlloc(HYPRE_Int, j, HYPRE_MEMORY_HOST); jnode= hypre_CTAlloc(HYPRE_BigInt, j, HYPRE_MEMORY_HOST); vals = hypre_TAlloc(HYPRE_Real, j, HYPRE_MEMORY_HOST); 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, HYPRE_MEMORY_HOST); hypre_TFree(inode, HYPRE_MEMORY_HOST); hypre_TFree(jnode, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); 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]); hypre_ParVectorSetPartitioningOwner(resn_l[i], 0); 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]); hypre_ParVectorSetPartitioningOwner(en_l[i], 0); 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]); hypre_ParVectorSetPartitioningOwner(nVtemp_l[i], 0); 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]); hypre_ParVectorSetPartitioningOwner(nVtemp2_l[i], 0); nCF_marker_l[i] = hypre_ParAMGDataCFMarkerArray(amg_data)[i]; 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]); hypre_ParVectorSetPartitioningOwner(rese_l[0], 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]); hypre_ParVectorSetPartitioningOwner(ee_l[0], 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]); hypre_ParVectorSetPartitioningOwner(eVtemp_l[0], 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]); hypre_ParVectorSetPartitioningOwner(eVtemp2_l[0], 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_ParCSRMatrixSetRowStartsOwner(transpose,0); hypre_ParCSRMatrixSetRowStartsOwner(Aen_l[l+1],1); 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]); hypre_ParVectorSetPartitioningOwner(xe_l[l+1], 0); 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]); hypre_ParVectorSetPartitioningOwner(be_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(rese_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(ee_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(eVtemp_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(eVtemp2_l[l+1],0); } /* 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]); hypre_ParVectorSetPartitioningOwner(xe_l[l+1], 0); 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]); hypre_ParVectorSetPartitioningOwner(be_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(ee_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(rese_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(eVtemp_l[l+1],0); 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]); hypre_ParVectorSetPartitioningOwner(eVtemp2_l[l+1],0); } /* 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.18.2/src/sstruct_ls/maxwell_grad.c000066400000000000000000000677161355566575400206070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Int ierr=0; hypre_BoxInit(&layer, ndim); hypre_BoxInit(&interior_box, ndim); hypre_MPI_Comm_rank(comm, &myproc); hypre_ClearIndex(shift); for (i= 0; i< ndim; i++) { hypre_IndexD(shift, i)= -1; } /* 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); /*------------------------------------------------------------------------------ * 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); ierr += 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); { hypre_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; } } /* 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); ierr+= 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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); ncols= hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_HOST); /* each row can have at most two columns */ k= 2*nrows; jedge= hypre_CTAlloc(HYPRE_BigInt, k, HYPRE_MEMORY_HOST); vals = hypre_TAlloc(HYPRE_Real, k, HYPRE_MEMORY_HOST); 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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(inode, HYPRE_MEMORY_HOST); hypre_TFree(jedge, HYPRE_MEMORY_HOST); hypre_TFree(vals, HYPRE_MEMORY_HOST); parcsr_grad= (hypre_ParCSRMatrix *) hypre_IJMatrixObject(T_grad); HYPRE_IJMatrixSetObjectType(T_grad, -1); HYPRE_IJMatrixDestroy(T_grad); return parcsr_grad; } hypre-2.18.2/src/sstruct_ls/maxwell_physbdy.c000066400000000000000000001101321355566575400213310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, **fbox_mapping; 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_SetIndex3(zero_shift, 0, 0, 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); { hypre_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.18.2/src/sstruct_ls/maxwell_semi_interp.c000066400000000000000000007531141355566575400222020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, 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, *iEdge; HYPRE_BigInt *jFace_edge; HYPRE_BigInt *jEdge_iedge; HYPRE_BigInt *jElement_Face, *jedge_Edge; HYPRE_BigInt *iElement, *jElement_Edge, *iedgeEdge, *jElement_edge; HYPRE_Real *vals_ElementEdge, *vals_ElementFace, *vals_edgeEdge, *vals_Faceedge; HYPRE_Real *vals_Elementedge, *vals_Edgeiedge; HYPRE_Int *ncols_Elementedge, *ncols_Edgeiedge, *ncols_edgeEdge, *ncols_Faceedge; HYPRE_Int *ncols_ElementFace, *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, *Edge_vartypes, *Face_vartypes; hypre_Index *varoffsets; HYPRE_Int *vartype_map; HYPRE_Int matrix_type= HYPRE_PARCSR; HYPRE_Int nvars, Face_nvars, Edge_nvars, part, var, box, fboxi; 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_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); for (i= 0; i< ndim; i++) { one_index[i]= 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, HYPRE_MEMORY_HOST); } iEdge = hypre_CTAlloc(HYPRE_BigInt, nEdges, HYPRE_MEMORY_HOST); iElement= hypre_CTAlloc(HYPRE_BigInt, nElements, HYPRE_MEMORY_HOST); /* array structures needed for forming ij_matrices */ /* Element_edge. Same for 2-d and 3-d. */ ncols_Elementedge= hypre_CTAlloc(HYPRE_Int, nElements, HYPRE_MEMORY_HOST); for (i= 0; i< nElements; i++) { ncols_Elementedge[i]= n_Cell_iedges; } jElement_edge = hypre_CTAlloc(HYPRE_BigInt, nElements_iedges, HYPRE_MEMORY_HOST); vals_Elementedge = hypre_CTAlloc(HYPRE_Real, nElements_iedges, HYPRE_MEMORY_HOST); /*--------------------------------------------------------------------------- * 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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(jElement_edge, HYPRE_MEMORY_HOST); hypre_TFree(vals_Elementedge, HYPRE_MEMORY_HOST); /* 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, HYPRE_MEMORY_HOST); 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, HYPRE_MEMORY_HOST); vals_Faceedge= hypre_CTAlloc(HYPRE_Real, j, HYPRE_MEMORY_HOST); 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); { hypre_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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(iFace, HYPRE_MEMORY_HOST); hypre_TFree(jFace_edge, HYPRE_MEMORY_HOST); hypre_TFree(vals_Faceedge, HYPRE_MEMORY_HOST); } /* 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, HYPRE_MEMORY_HOST); 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; } } 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, HYPRE_MEMORY_HOST); vals_Edgeiedge= hypre_CTAlloc(HYPRE_Real, k, HYPRE_MEMORY_HOST); 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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(iEdge, HYPRE_MEMORY_HOST); hypre_TFree(jEdge_iedge, HYPRE_MEMORY_HOST); hypre_TFree(vals_Edgeiedge, HYPRE_MEMORY_HOST); /* Element_Face & Element_Edge. Element_Face only for 3-d. */ if (ndim == 3) { ncols_ElementFace= hypre_CTAlloc(HYPRE_Int, nElements, HYPRE_MEMORY_HOST); 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, HYPRE_MEMORY_HOST); vals_ElementFace= hypre_CTAlloc(HYPRE_Real, j, HYPRE_MEMORY_HOST); for (i= 0; i< j; i++) { vals_ElementFace[i]= 1.0; } } ncols_ElementEdge= hypre_CTAlloc(HYPRE_Int, nElements, HYPRE_MEMORY_HOST); 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, HYPRE_MEMORY_HOST); vals_ElementEdge= hypre_CTAlloc(HYPRE_Real, k, HYPRE_MEMORY_HOST); 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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(jElement_Face, HYPRE_MEMORY_HOST); hypre_TFree(vals_ElementFace, HYPRE_MEMORY_HOST); } /* 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, HYPRE_MEMORY_HOST); hypre_TFree(iElement, HYPRE_MEMORY_HOST); hypre_TFree(jElement_Edge, HYPRE_MEMORY_HOST); hypre_TFree(vals_ElementEdge, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * 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, HYPRE_MEMORY_HOST); ncols_edgeEdge= hypre_CTAlloc(HYPRE_Int, nedges, HYPRE_MEMORY_HOST); /*----------------------------------------------------------------------- * 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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); jedge_Edge = hypre_CTAlloc(HYPRE_BigInt, k, HYPRE_MEMORY_HOST); 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; } } 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; hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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; } } /* 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); { hypre_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); { hypre_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); { hypre_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); { hypre_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); { hypre_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, HYPRE_MEMORY_HOST); hypre_TFree(iedgeEdge, HYPRE_MEMORY_HOST); hypre_TFree(jedge_Edge, HYPRE_MEMORY_HOST); hypre_TFree(vals_edgeEdge, 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++) { 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.18.2/src/sstruct_ls/maxwell_zeroBC.c000066400000000000000000000021761355566575400210430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/nd1_amge_interpolation.c000066400000000000000000000372751355566575400225600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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 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; I[0] = 0; for (j = 0; j < num_idof; j++) { getrow_ierr= hypre_ParCSRMatrixGetRow (Aee, idof[j], &I[j+1], &tmp_J, &tmp_data); if (getrow_ierr <0) hypre_printf("getrow Aee off proc[%d] = \n",myproc); hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); J+= I[j+1]; data+= I[j+1]; hypre_ParCSRMatrixRestoreRow (Aee, idof[j], &I[j+1], &tmp_J, &tmp_data); I[j+1] += 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; I[0] = 0; for (j = 0; j < num_idof; j++) { getrow_ierr= hypre_ParCSRMatrixGetRow (dof_DOF, idof[j], &I[j+1], &tmp_J, &tmp_data); if (getrow_ierr >= 0) { hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); J+= I[j+1]; data+= I[j+1]; hypre_ParCSRMatrixRestoreRow (dof_DOF, idof[j], &I[j+1], &tmp_J, &tmp_data); I[j+1] += I[j]; } else /* row offproc */ { hypre_ParCSRMatrixRestoreRow (dof_DOF, idof[j], &I[j+1], &tmp_J, &tmp_data); /* search for OffProcRows */ m= 0; while (m < num_OffProcRows) { if (offproc_rnums[m] == idof[j]) { break; } else { m++; } } I[j+1]= (OffProcRows[swap[m]] -> ncols); tmp_J = (OffProcRows[swap[m]] -> cols); tmp_data= (OffProcRows[swap[m]] -> data); hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); J+= I[j+1]; data+= I[j+1]; I[j+1] += I[j]; } } for ( ; j < num_idof + num_bdof; j++) { getrow_ierr= hypre_ParCSRMatrixGetRow (dof_DOF, bdof[j-num_idof], &I[j+1], &tmp_J, &tmp_data); if (getrow_ierr >= 0) { hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); J+= I[j+1]; data+= I[j+1]; hypre_ParCSRMatrixRestoreRow (dof_DOF, bdof[j-num_idof], &I[j+1], &tmp_J, &tmp_data); I[j+1] += I[j]; } else /* row offproc */ { hypre_ParCSRMatrixRestoreRow (dof_DOF, bdof[j-num_idof], &I[j+1], &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"); I[j+1]= (OffProcRows[swap[m]] -> ncols); tmp_J = (OffProcRows[swap[m]] -> cols); tmp_data= (OffProcRows[swap[m]] -> data); hypre_TMemcpy(J, tmp_J, HYPRE_BigInt, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); hypre_TMemcpy(data, tmp_data, HYPRE_Real, I[j+1], HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); J+= I[j+1]; data+= I[j+1]; I[j+1] += 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.18.2/src/sstruct_ls/nd1_amge_interpolation.h000066400000000000000000000052251355566575400225530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/node_relax.c000066400000000000000000001220531355566575400202430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "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_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) { 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, HYPRE_MEMORY_DEVICE); hypre_TFree(relax_data -> A_loc, HYPRE_MEMORY_DEVICE); */ hypre_TFree(relax_data -> bp, HYPRE_MEMORY_DEVICE); hypre_TFree(relax_data -> xp, HYPRE_MEMORY_DEVICE); hypre_TFree(relax_data -> tp, HYPRE_MEMORY_DEVICE); hypre_TFree(relax_data -> Ap, HYPRE_MEMORY_DEVICE); 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; /*---------------------------------------------------------- * 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; } } } /*---------------------------------------------------------- * Allocate storage used to invert local diagonal blocks *----------------------------------------------------------*/ /* i = hypre_NumThreads(); x_loc = hypre_TAlloc(HYPRE_Real , i*nvars, HYPRE_MEMORY_DEVICE); A_loc = hypre_TAlloc(HYPRE_Real , i*nvars*nvars, HYPRE_MEMORY_DEVICE); */ /* Allocate pointers for vector and matrix */ bp = hypre_TAlloc(HYPRE_Real *, nvars, HYPRE_MEMORY_DEVICE); xp = hypre_TAlloc(HYPRE_Real *, nvars, HYPRE_MEMORY_DEVICE); tp = hypre_TAlloc(HYPRE_Real *, nvars, HYPRE_MEMORY_DEVICE); Ap = hypre_TAlloc(HYPRE_Real *, nvars*nvars, HYPRE_MEMORY_DEVICE); /*---------------------------------------------------------- * 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 -> 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) = 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); /* if cannot access device memory from host */ #if HYPRE_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE 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]; #else HYPRE_Real **h_Ap = Ap; HYPRE_Real **h_bp = bp; HYPRE_Real **h_xp = xp; HYPRE_Real **h_tp = tp; #endif 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_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE hypre_Memcpy(Ap, h_Ap, nvars*nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_Memcpy(bp, h_bp, nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_Memcpy(xp, h_xp, nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #endif 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]; HYPRE_Real x_loc[HYPRE_MAXVARS]; /*------------------------------------------------ * 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); /*------------------------------------------------ * 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_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE hypre_Memcpy(bp, h_bp, nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_Memcpy(tp, h_tp, nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #endif 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_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE hypre_Memcpy(Ap, h_Ap, nvars*nvars*sizeof(HYPRE_Real*), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #endif #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]; HYPRE_Real x_loc[HYPRE_MAXVARS]; /*------------------------------------------------ * 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); /*------------------------------------------------ * 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.18.2/src/sstruct_ls/sstruct_amr_intercommunication.c000066400000000000000000000076271355566575400244710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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); 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, NULL, 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.18.2/src/sstruct_ls/sstruct_owninfo.c000066400000000000000000000233471355566575400213770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sstruct_owninfo.h000066400000000000000000000035371355566575400214030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/sstruct_recvinfo.c000066400000000000000000000132161355566575400215250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sstruct_recvinfo.h000066400000000000000000000014271355566575400215330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/sstruct_sendinfo.c000066400000000000000000000144601355566575400215210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sstruct_sendinfo.h000066400000000000000000000015051355566575400215220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/sstruct_sharedDOFComm.c000066400000000000000000001075651355566575400223400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; hypre_BoxArray *recv_slabs, *send_slabs; 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_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); { hypre_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.18.2/src/sstruct_ls/sstruct_sharedDOFComm.h000066400000000000000000000013761355566575400223360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/sys_pfmg.c000066400000000000000000000307101355566575400177500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_pfmg.h000066400000000000000000000055111355566575400177560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_ls/sys_pfmg_relax.c000066400000000000000000000221641355566575400211470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_pfmg_setup.c000066400000000000000000000505361355566575400212000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_pfmg_setup_interp.c000066400000000000000000000055701355566575400225570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_pfmg_setup_rap.c000066400000000000000000000135271355566575400220410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_pfmg_solve.c000066400000000000000000000255341355566575400211700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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); 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); 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 */ 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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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_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 for (l = 1; l <= (num_levels - 2); l++) { if (active_l[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 } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ 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]); #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 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]); #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 } /* 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); } /*----------------------------------------------------- * 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); return hypre_error_flag; } hypre-2.18.2/src/sstruct_ls/sys_semi_interp.c000066400000000000000000000110441355566575400213340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_ls/sys_semi_restrict.c000066400000000000000000000113371355566575400216770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_mv/000077500000000000000000000000001355566575400157605ustar00rootroot00000000000000hypre-2.18.2/src/sstruct_mv/CMakeLists.txt000066400000000000000000000016161355566575400205240ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/sstruct_mv/F90_HYPRE_sstruct_graph.c000066400000000000000000000135211355566575400224030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/F90_HYPRE_sstruct_grid.c000066400000000000000000000211751355566575400222330ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/F90_HYPRE_sstruct_matrix.c000066400000000000000000000302461355566575400226110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/F90_HYPRE_sstruct_stencil.c000066400000000000000000000045071355566575400227470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/F90_HYPRE_sstruct_vector.c000066400000000000000000000272431355566575400226120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/HYPRE_sstruct_graph.c000066400000000000000000000772221355566575400217750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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); 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_CTAlloc(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; #ifdef HYPRE_NO_GLOBAL_PARTITION /* 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 */ #endif 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; } /*free each add entry after copying */ hypre_TFree(new_entry, HYPRE_MEMORY_HOST); }/* end of loop through add entries */ /* free the storage for the add entires */ hypre_TFree(add_entries, HYPRE_MEMORY_HOST); /*--------------------------------------------------------- * 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-2.18.2/src/sstruct_mv/HYPRE_sstruct_grid.c000066400000000000000000001014371355566575400216150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_TAlloc(HYPRE_Int, fem_nvars, HYPRE_MEMORY_HOST); fem_offsets = hypre_TAlloc(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.18.2/src/sstruct_mv/HYPRE_sstruct_matrix.c000066400000000000000000001070041355566575400221700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_SStructMatrixTmpColCoords(matrix) = NULL; hypre_SStructMatrixTmpCoeffs(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; if (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_SStructMatrixTmpColCoords(matrix), HYPRE_MEMORY_HOST); hypre_TFree(hypre_SStructMatrixTmpCoeffs(matrix), HYPRE_MEMORY_HOST); 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_Int 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; } 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; } HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &hypre_SStructMatrixIJMatrix(matrix)); hypre_SStructUMatrixInitialize(matrix); 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 */ 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[3]; 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 */ 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[3]; 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_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_Int HYPRE_SStructMatrixPrint( const char *filename, HYPRE_SStructMatrix matrix, HYPRE_Int all ) { HYPRE_Int nparts = hypre_SStructMatrixNParts(matrix); HYPRE_Int part; char new_filename[255]; for (part = 0; part < nparts; part++) { hypre_sprintf(new_filename, "%s.%02d", filename, part); hypre_SStructPMatrixPrint(new_filename, hypre_SStructMatrixPMatrix(matrix, part), all); } /* U-matrix */ hypre_sprintf(new_filename, "%s.UMatrix", filename); HYPRE_IJMatrixPrint(hypre_SStructMatrixIJMatrix(matrix), new_filename); 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.18.2/src/sstruct_mv/HYPRE_sstruct_mv.h000066400000000000000000001224441355566575400213200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name SStruct System Interface * * This interface represents a semi-structured-grid conceptual view of a linear * system. * * @memo A semi-structured-grid conceptual interface **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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: * \begin{itemize} * \item cell centered variables are aligned with the index; * \item node centered variables are aligned with the cell corner * at relative index (1/2, 1/2, 1/2); * \item 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; * \item 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. * \end{itemize} * * The supported identifiers are: * \begin{itemize} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_CELL} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_NODE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_XFACE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_YFACE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_ZFACE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_XEDGE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_YEDGE} * \item {\tt HYPRE\_SSTRUCT\_VARIABLE\_ZEDGE} * \end{itemize} * * 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 {\tt ndim}-dimensional grid object with {\tt 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 {\tt ordering} is composed of blocks of size (1 + {\tt 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 {\tt ZEDGE} for this to make sense. The * {\tt 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 {\tt part} and {\tt nbor\_part} must be different, except in the case * where only cell-centered data is used. * * Indexes should increase from {\tt ilower} to {\tt iupper}. It is not * necessary that indexes increase from {\tt nbor\_ilower} to {\tt * nbor\_iupper}. * * The {\tt index\_map} describes the mapping of indexes 0, 1, and 2 on part * {\tt part} to the corresponding indexes on part {\tt nbor\_part}. For * example, triple (1, 2, 0) means that indexes 0, 1, and 2 on part {\tt part} * map to indexes 1, 2, and 0 on part {\tt nbor\_part}, respectively. * * The {\tt index\_dir} describes the direction of the mapping in {\tt * index\_map}. For example, triple (1, 1, -1) means that for indexes 0 and 1, * increasing values map to increasing values on {\tt 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 {\tt part} and {\tt shared\_part} must be different. * * Indexes should increase from {\tt ilower} to {\tt iupper}. It is not * necessary that indexes increase from {\tt shared\_ilower} to {\tt * shared\_iupper}. This is to maintain consistency with the {\tt * SetNeighborPart} function, which is also able to describe shared regions but * in a more limited fashion. * * The {\tt 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 {\tt * ilower} and {\tt iupper} on part {\tt 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 {\tt 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 {\tt shared\_offset} is used in the same way as {\tt offset}, but with * respect to the box extents {\tt shared\_ilower} and {\tt shared\_iupper} on * part {\tt shared\_part}. * * The {\tt index\_map} describes the mapping of indexes 0, 1, and 2 on part * {\tt part} to the corresponding indexes on part {\tt shared\_part}. For * example, triple (1, 2, 0) means that indexes 0, 1, and 2 on part {\tt part} * map to indexes 1, 2, and 0 on part {\tt shared\_part}, respectively. * * The {\tt index\_dir} describes the direction of the mapping in {\tt * index\_map}. For example, triple (1, 1, -1) means that for indexes 0 and 1, * increasing values map to increasing values on {\tt 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 {\tt ilower} and {\tt 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 {\tt periodic} is an {\tt 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 {\tt sparsity} contains {\tt 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); /** * Set matrix coefficients index by index. The {\tt values} array is of length * {\tt 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 {\tt values} array is of * length {\tt 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 {\tt values} is determined by the routines * \Ref{HYPRE_SStructGridSetFEMOrdering} and * \Ref{HYPRE_SStructGraphSetFEMSparsity}. **/ HYPRE_Int HYPRE_SStructMatrixAddFEMValues(HYPRE_SStructMatrix matrix, HYPRE_Int part, HYPRE_Int *index, HYPRE_Complex *values); /** * Get matrix coefficients index by index. The {\tt values} array is of length * {\tt 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 {\tt 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 {\tt values} is ordered * as follows: * \begin{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++; } \end{verbatim} * * 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 {\tt 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 {\tt values} array is logically * box shaped with value-box extents {\tt vilower} and {\tt viupper} that must * contain the set-box extents {\tt ilower} and {\tt iupper} . The data in the * {\tt 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 {\tt 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); /** * 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 {\tt 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 {\tt 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); /** * Define symmetry properties for the stencil entries in the matrix. The * boolean argument {\tt symmetric} is applied to stencil entries on part {\tt * part} that couple variable {\tt var} to variable {\tt to\_var}. A value of * -1 may be used for {\tt part}, {\tt var}, or {\tt to\_var} to specify * ``all''. For example, if {\tt part} and {\tt to\_var} are set to -1, then * the boolean is applied to stencil entries on all parts that couple variable * {\tt 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, {\tt * type} can be either {\tt HYPRE\_SSTRUCT} (the default), {\tt HYPRE\_STRUCT}, * or {\tt 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt values} is determined by the routine * \Ref{HYPRE_SStructGridSetFEMOrdering}. **/ 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 {\tt 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 {\tt values} is ordered * as follows: * \begin{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++; } \end{verbatim} * * 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 {\tt 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 {\tt values} array is logically * box shaped with value-box extents {\tt vilower} and {\tt viupper} that must * contain the set-box extents {\tt ilower} and {\tt iupper} . The data in the * {\tt 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 {\tt 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); /** * 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 {\tt 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 {\tt 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); /** * Gather vector data so that efficient {\tt GetValues} can be done. This * routine must be called prior to calling {\tt 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, {\tt * type} can be either {\tt HYPRE\_SSTRUCT} (the default), {\tt HYPRE\_STRUCT}, * or {\tt 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); /*@}*/ /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/sstruct_mv/HYPRE_sstruct_stencil.c000066400000000000000000000052161355566575400223270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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-2.18.2/src/sstruct_mv/HYPRE_sstruct_vector.c000066400000000000000000000764301355566575400221760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* GEC1002 destroying data indices and data in vector */ if (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 structvector */ /* 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), HYPRE_MEMORY_SHARED); } 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; /* GEC0902 addition of variables for ilower and iupper */ HYPRE_Int 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, HYPRE_MEMORY_SHARED); 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; } if(vector_type == HYPRE_SSTRUCT || vector_type == HYPRE_STRUCT) { ilower = hypre_SStructGridGhstartRank(grid); iupper = ilower + hypre_SStructGridGhlocalSize(grid) - 1; } 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); /* 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_MEMORY_SHARED); 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 */ 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[3]; 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 */ 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[3]; 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_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); HYPRE_IJVectorGetObject(ijvector, (void **) &hypre_SStructVectorParVector(vector)); /*------------------------------------------------------ *------------------------------------------------------*/ /* 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_Int HYPRE_SStructVectorPrint( const char *filename, HYPRE_SStructVector vector, HYPRE_Int all ) { HYPRE_Int nparts = hypre_SStructVectorNParts(vector); HYPRE_Int part; char new_filename[255]; for (part = 0; part < nparts; part++) { hypre_sprintf(new_filename, "%s.%02d", filename, part); hypre_SStructPVectorPrint(new_filename, hypre_SStructVectorPVector(vector, part), all); } 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.18.2/src/sstruct_mv/Makefile000066400000000000000000000042751355566575400174300ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)/../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_matrix.c\ sstruct_matvec.c\ sstruct_scale.c\ sstruct_stencil.c\ sstruct_vector.c OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/sstruct_mv/_hypre_sstruct_mv.h000066400000000000000000001516261355566575400217230ustar00rootroot00000000000000 /*** 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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_BigInt *tmp_col_coords; HYPRE_Complex *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_SStructMatrixTmpColCoords(mat) ((mat) -> tmp_col_coords) #define hypre_SStructMatrixTmpCoeffs(mat) ((mat) -> 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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_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_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_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_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_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 ); /* 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 ); /* 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 ); #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/sstruct_mv/headers000077500000000000000000000027661355566575400173340ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/protos.h000066400000000000000000000500451355566575400174630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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_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_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_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 ); /* 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 ); /* 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-2.18.2/src/sstruct_mv/sstruct_axpy.c000066400000000000000000000050071355566575400206760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_copy.c000066400000000000000000000061111355566575400206640ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_graph.c000066400000000000000000000143641355566575400210240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_graph.h000066400000000000000000000167401355566575400210310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_grid.c000066400000000000000000002433321355566575400206470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; } /*========================================================================== * 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_Int local_size = hypre_SStructGridLocalSize(grid); hypre_BoxManager ***managers; hypre_SStructBoxManInfo info_obj; hypre_SStructPGrid *pgrid; HYPRE_Int nvars; hypre_StructGrid *sgrid; hypre_Box *bounding_box; HYPRE_Int 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_Int ghoffsets[2]; HYPRE_Int ghlocal_size = hypre_SStructGridGhlocalSize(grid); HYPRE_Int info_size; HYPRE_Int 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_Int scan_recv; /* offsets */ hypre_MPI_Scan( &local_size, &scan_recv, 1, HYPRE_MPI_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_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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION { /* 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); } #endif /* 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 #ifdef HYPRE_NO_GLOBAL_PARTITION { 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 #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-2.18.2/src/sstruct_mv/sstruct_grid.h000066400000000000000000000313221355566575400206460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_innerprod.c000066400000000000000000000055361355566575400217240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_matrix.c000066400000000000000000001600111355566575400212160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*========================================================================== * 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_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_CUDA_CALL(cudaDeviceSynchronize()); #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, rowstart, nnzs ; 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(HYPRE_BOX_PRIVATE,mi) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop1For(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_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); 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_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); 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] = 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] = values[i]; ncoeffs++; } } } 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); } 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_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, i; HYPRE_Int matrix_type = hypre_SStructMatrixObjectType(matrix); box = hypre_BoxCreate(ndim); /*------------------------------------------ * 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, HYPRE_MEMORY_SHARED); rows = hypre_CTAlloc(HYPRE_BigInt, nrows, HYPRE_MEMORY_SHARED); row_indexes = hypre_CTAlloc(HYPRE_Int, nrows, HYPRE_MEMORY_SHARED); cols = hypre_CTAlloc(HYPRE_BigInt, nrows*nentries, HYPRE_MEMORY_SHARED); ijvalues = hypre_CTAlloc(HYPRE_Complex, nrows*nentries, HYPRE_MEMORY_SHARED); 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(i) HYPRE_SMP_SCHEDULE #endif for (i = 0; i < nrows; i++) { ncols[i] = 0; row_indexes[i] = i*nentries; } 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); /*FIXME: Currently works only for the default boxloop (see GetIndex below) */ zypre_BoxLoop2Begin(ndim, loop_size, box, start, stride, mi, value_box, start, stride, vi); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop2For(mi, vi) { hypre_Index index; HYPRE_Int d, ci; hypre_BoxLoopGetIndex(index); /* FIXME (see comment above) */ ci = mi*nentries + ncols[mi]; rows[mi] = row_base; cols[ci] = col_base; 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]++; } zypre_BoxLoop2End(mi, vi); } /* 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, HYPRE_MEMORY_SHARED); hypre_TFree(rows, HYPRE_MEMORY_SHARED); hypre_TFree(row_indexes, HYPRE_MEMORY_SHARED); hypre_TFree(cols, HYPRE_MEMORY_SHARED); hypre_TFree(ijvalues, HYPRE_MEMORY_SHARED); 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); { hypre_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); HYPRE_IJMatrixGetObject( ijmatrix, (void **) &hypre_SStructMatrixParCSRMatrix(matrix)); 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 nfrentries, ntoentries, frpart, topart; HYPRE_Int entry, sentry, ei, fri, toi; 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)) { tvalues = hypre_TReAlloc(tvalues, HYPRE_Complex, hypre_BoxVolume(ibox1), HYPRE_MEMORY_SHARED); if (action >= 0) { /* set or add */ /* copy values into tvalues */ start = hypre_BoxIMin(ibox1); hypre_BoxGetSize(ibox1, loop_size); zypre_BoxLoop2Begin(ndim, loop_size, ibox1, start, stride, mi, value_box, start, stride, vi); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop2For(mi, vi) { tvalues[mi] = values[ei + vi*nentries]; } zypre_BoxLoop2End(mi, vi); /* 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); zypre_BoxLoop2Begin(ndim, loop_size, ibox1, start, stride, mi, value_box, start, stride, vi); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop2For(mi, vi) { values[ei + vi*nentries] = tvalues[mi]; } zypre_BoxLoop2End(mi, vi); } /* 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, HYPRE_MEMORY_SHARED); return hypre_error_flag; } hypre-2.18.2/src/sstruct_mv/sstruct_matrix.h000066400000000000000000000133211355566575400212240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_BigInt *tmp_col_coords; HYPRE_Complex *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_SStructMatrixTmpColCoords(mat) ((mat) -> tmp_col_coords) #define hypre_SStructMatrixTmpCoeffs(mat) ((mat) -> 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.18.2/src/sstruct_mv/sstruct_matvec.c000066400000000000000000000313631355566575400212000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_scale.c000066400000000000000000000035031355566575400210030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_stencil.c000066400000000000000000000014561355566575400213620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/sstruct_mv/sstruct_stencil.h000066400000000000000000000036771355566575400213760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/sstruct_mv/sstruct_vector.c000066400000000000000000000711031355566575400212170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*========================================================================== * 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_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_CUDA_CALL(cudaDeviceSynchronize()); #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 ) { 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-2.18.2/src/sstruct_mv/sstruct_vector.h000066400000000000000000000112511355566575400212220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_ls/000077500000000000000000000000001355566575400155715ustar00rootroot00000000000000hypre-2.18.2/src/struct_ls/CMakeLists.txt000066400000000000000000000033631355566575400203360ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 general.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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/struct_ls/F90_HYPRE_struct_bicgstab.c000066400000000000000000000205151355566575400225070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 * 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 == 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.18.2/src/struct_ls/F90_HYPRE_struct_cycred.c000066400000000000000000000073751355566575400222130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/F90_HYPRE_struct_flexgmres.c000066400000000000000000000216541355566575400227320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 * 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 == 5) { *ierr = (hypre_F90_Int) ( HYPRE_StructFlexGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSparseMSGSolve, HYPRE_StructSparseMSGSetup, 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.18.2/src/struct_ls/F90_HYPRE_struct_gmres.c000066400000000000000000000215341355566575400220500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 * 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 == 5) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSparseMSGSolve, HYPRE_StructSparseMSGSetup, 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.18.2/src/struct_ls/F90_HYPRE_struct_hybrid.c000066400000000000000000000311601355566575400222100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 *------------------------------------------------------------*/ 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 { *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.18.2/src/struct_ls/F90_HYPRE_struct_int.c000066400000000000000000000044751355566575400215320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/F90_HYPRE_struct_jacobi.c000066400000000000000000000165341355566575400221660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/F90_HYPRE_struct_lgmres.c000066400000000000000000000225351355566575400222260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 * 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 == 5) { *ierr = (hypre_F90_Int) ( HYPRE_StructLGMRESSetPrecond( hypre_F90_PassObj (HYPRE_StructSolver, solver), HYPRE_StructSparseMSGSolve, HYPRE_StructSparseMSGSetup, 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.18.2/src/struct_ls/F90_HYPRE_struct_pcg.c000066400000000000000000000244351355566575400215070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/F90_HYPRE_struct_pfmg.c000066400000000000000000000377341355566575400216750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/F90_HYPRE_struct_smg.c000066400000000000000000000306111355566575400215150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_ls/F90_HYPRE_struct_sparse_msg.c000066400000000000000000000253751355566575400231050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/HYPRE_struct_bicgstab.c000066400000000000000000000127161355566575400220750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/struct_ls/HYPRE_struct_cycred.c000066400000000000000000000066051355566575400215700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/HYPRE_struct_flexgmres.c000066400000000000000000000137471355566575400223200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_FlexGMRESFunctions * fgmres_functions = hypre_FlexGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/struct_ls/HYPRE_struct_gmres.c000066400000000000000000000124621355566575400214320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_GMRESFunctions * gmres_functions = hypre_GMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/struct_ls/HYPRE_struct_hybrid.c000066400000000000000000000237071355566575400216020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/HYPRE_struct_int.c000066400000000000000000000110351355566575400211020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" 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; /*----------------------------------------------------------------------- * Set the vector coefficients *-----------------------------------------------------------------------*/ // srand( seed ); hypre_SeedRand(seed); hypre_SetIndex3(unit_stride, 1, 1, 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); /* TODO: generate on host and copy to device. FIX? */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int loop_n = 1, ii; for (ii = 0; ii < hypre_StructVectorNDim(vector); ii++) { loop_n *= loop_size[ii]; } HYPRE_Real *rand_host = hypre_TAlloc(HYPRE_Real, loop_n, HYPRE_MEMORY_HOST); HYPRE_Real *rand_device = hypre_TAlloc(HYPRE_Real, loop_n, HYPRE_MEMORY_DEVICE); ii = 0; hypre_SerialBoxLoop0Begin(hypre_StructVectorNDim(vector),loop_size) { rand_host[ii++] = 2.0*hypre_Rand() - 1.0; } hypre_SerialBoxLoop0End() hypre_TMemcpy(rand_device, rand_host, HYPRE_Real, loop_n, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #endif #define DEVICE_VAR is_device_ptr(vp, rand_device) hypre_BoxLoop1Begin(hypre_StructVectorNDim(vector), loop_size, v_data_box, start, unit_stride, vi); { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) vp[vi] = rand_device[idx]; #else vp[vi] = 2.0*hypre_Rand() - 1.0; #endif } hypre_BoxLoop1End(vi); #undef DEVICE_VAR #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_TFree(rand_device, HYPRE_MEMORY_DEVICE); hypre_TFree(rand_host, HYPRE_MEMORY_HOST); #endif } 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.18.2/src/struct_ls/HYPRE_struct_jacobi.c000066400000000000000000000124061355566575400215420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/HYPRE_struct_lgmres.c000066400000000000000000000132651355566575400216100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_LGMRESFunctions * lgmres_functions = hypre_LGMRESFunctionsCreate( hypre_CAlloc, 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.18.2/src/struct_ls/HYPRE_struct_ls.h000066400000000000000000001167131355566575400207440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #ifdef __cplusplus extern "C" { #endif /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct Solvers * * These solvers use matrix/vector storage schemes that are tailored * to structured grid problems. * * @memo Linear solvers for structured grids **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 */ #ifndef HYPRE_SOLVER_STRUCT #define HYPRE_SOLVER_STRUCT struct hypre_Solver_struct; typedef struct hypre_Solver_struct *HYPRE_Solver; #endif 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 {\tt b} and {\tt 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); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructJacobiSetMaxIter(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); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using {\tt 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 $N = 2^m * M$ where $M$ is not * a power-of-two, then $M$ should be as small as possible. Large values of $M$ * 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 {\tt b} and {\tt 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); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructPFMGSetMaxIter(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); /** * (Optional) Additionally require that the relative difference in * successive iterates be small. **/ HYPRE_Int HYPRE_StructPFMGSetRelChange(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); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using {\tt SetZeroGuess}. **/ HYPRE_Int HYPRE_StructPFMGSetNonZeroGuess(HYPRE_StructSolver solver); /** * (Optional) Set relaxation type. * * Current relaxation methods set by {\tt relax\_type} are: * * \begin{tabular}{l@{ -- }l} * 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) \\ * \end{tabular} **/ HYPRE_Int HYPRE_StructPFMGSetRelaxType(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 {\tt rap\_type} are: * * \begin{tabular}{l@{ -- }l} * 0 & Galerkin (default) \\ * 1 & non-Galerkin 5-pt or 7-pt stencils \\ * \end{tabular} * * 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); /** * (Optional) Set number of relaxation sweeps before coarse-grid correction. **/ HYPRE_Int HYPRE_StructPFMGSetNumPreRelax(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); /** * (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); /* * 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); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_StructPFMGSetPrintLevel(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 defined(HYPRE_USING_CUDA) 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 {\tt b} and {\tt 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); /** * (Optional) Set the convergence tolerance. **/ HYPRE_Int HYPRE_StructSMGSetTol(HYPRE_StructSolver solver, HYPRE_Real tol); /** * (Optional) Set maximum number of iterations. **/ HYPRE_Int HYPRE_StructSMGSetMaxIter(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); /** * (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); /** * (Optional) Use a nonzero initial guess. This is the default behavior, but * this routine allows the user to switch back after using {\tt 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); /** * (Optional) Set number of relaxation sweeps after coarse-grid correction. **/ HYPRE_Int HYPRE_StructSMGSetNumPostRelax(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); /** * (Optional) Set the amount of printing to do to the screen. **/ HYPRE_Int HYPRE_StructSMGSetPrintLevel(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 defined(HYPRE_USING_CUDA) 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 {\tt b} and {\tt 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 {\tt 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{PCG Solver}. **/ /*@{*/ /** * 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{GMRES Solver}. **/ /*@{*/ /** * 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{FlexGMRES Solver}. **/ /*@{*/ /** * 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{LGMRES Solver}. **/ /*@{*/ /** * 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{BiCGSTAB Solver}. **/ /*@{*/ /** * 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 {\tt b} and {\tt 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 {\tt 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 {\tt 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 {\tt 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 {\tt solver\_type} are: * * \begin{tabular}{l@{ -- }l} * 0 & PCG (default) \\ * 1 & GMRES \\ * 2 & BiCGSTAB \\ * \end{tabular} **/ 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); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* * @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); /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* These includes shouldn't be here. (RDF) */ #include "interpreter.h" #include "HYPRE_MatvecFunctions.h" #include "_hypre_struct_mv.h" /** * @name Struct LOBPCG Eigensolver * * These routines should be used in conjunction with the generic interface in * \Ref{LOBPCG Eigensolver}. **/ /*@{*/ /** * 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); /* The next routines should not be here (lower-case prefix). (RDF) */ /* * Set hypre_StructPVector to random values. **/ HYPRE_Int hypre_StructVectorSetRandomValues(hypre_StructVector *vector, HYPRE_Int seed); /* * Same as hypre_StructVectorSetRandomValues except uses void pointer. **/ HYPRE_Int hypre_StructSetRandomValues(void *v, HYPRE_Int seed); /*@}*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*@}*/ #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/struct_ls/HYPRE_struct_pcg.c000066400000000000000000000200501355566575400210560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_StructPCGCreate( MPI_Comm comm, HYPRE_StructSolver *solver ) { /* 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_CAlloc, 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 ) { return hypre_error_flag; } /*==========================================================================*/ HYPRE_Int HYPRE_StructDiagScale( HYPRE_StructSolver solver, HYPRE_StructMatrix HA, HYPRE_StructVector Hy, HYPRE_StructVector Hx ) { 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.18.2/src/struct_ls/HYPRE_struct_pfmg.c000066400000000000000000000251621355566575400212470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 defined(HYPRE_USING_CUDA) HYPRE_Int HYPRE_StructPFMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ) { return( hypre_PFMGSetDeviceLevel( (void *) solver, device_level ) ); } #endif hypre-2.18.2/src/struct_ls/HYPRE_struct_smg.c000066400000000000000000000202321355566575400210750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 defined(HYPRE_USING_CUDA) HYPRE_Int HYPRE_StructSMGSetDeviceLevel( HYPRE_StructSolver solver, HYPRE_Int device_level ) { return (hypre_StructSMGSetDeviceLevel( (void *) solver, device_level )); } #endif hypre-2.18.2/src/struct_ls/HYPRE_struct_sparse_msg.c000066400000000000000000000205451355566575400224610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_ls/Makefile000066400000000000000000000060241355566575400172330ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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\ cyclic_reduction.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\ general.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_int.c\ HYPRE_struct_jacobi.c\ HYPRE_struct_lgmres.c\ HYPRE_struct_pcg.c\ HYPRE_struct_pfmg.c\ HYPRE_struct_smg.c\ HYPRE_struct_sparse_msg.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 OBJS = ${FILES:.c=.o} 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/struct_ls/_hypre_struct_ls.h000066400000000000000000001660251355566575400213440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include #include #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 /* 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_bicgstab.c */ HYPRE_Int HYPRE_StructBiCGSTABCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); 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 ); /* HYPRE_struct_flexgmres.c */ HYPRE_Int HYPRE_StructFlexGMRESCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); 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 atol ); 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 print_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_StructFlexGMRESSetModifyPC ( HYPRE_StructSolver solver , HYPRE_PtrToModifyPCFcn modify_pc ); /* HYPRE_struct_gmres.c */ HYPRE_Int HYPRE_StructGMRESCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); 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 atol ); 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 print_level ); HYPRE_Int HYPRE_StructGMRESGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_StructGMRESGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); /* HYPRE_struct_hybrid.c */ HYPRE_Int HYPRE_StructHybridCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); HYPRE_Int HYPRE_StructHybridDestroy ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructHybridSetup ( HYPRE_StructSolver 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 ); HYPRE_Int HYPRE_StructHybridSetTol ( HYPRE_StructSolver solver , HYPRE_Real tol ); HYPRE_Int HYPRE_StructHybridSetConvergenceTol ( HYPRE_StructSolver solver , HYPRE_Real cf_tol ); HYPRE_Int HYPRE_StructHybridSetDSCGMaxIter ( HYPRE_StructSolver solver , HYPRE_Int dscg_max_its ); HYPRE_Int HYPRE_StructHybridSetPCGMaxIter ( HYPRE_StructSolver solver , HYPRE_Int pcg_max_its ); HYPRE_Int HYPRE_StructHybridSetPCGAbsoluteTolFactor ( HYPRE_StructSolver solver , HYPRE_Real pcg_atolf ); HYPRE_Int HYPRE_StructHybridSetTwoNorm ( HYPRE_StructSolver solver , HYPRE_Int two_norm ); HYPRE_Int HYPRE_StructHybridSetStopCrit ( HYPRE_StructSolver solver , HYPRE_Int stop_crit ); HYPRE_Int HYPRE_StructHybridSetRelChange ( HYPRE_StructSolver solver , HYPRE_Int rel_change ); HYPRE_Int HYPRE_StructHybridSetSolverType ( HYPRE_StructSolver solver , HYPRE_Int solver_type ); HYPRE_Int HYPRE_StructHybridSetKDim ( HYPRE_StructSolver solver , HYPRE_Int k_dim ); HYPRE_Int HYPRE_StructHybridSetPrecond ( HYPRE_StructSolver solver , HYPRE_PtrToStructSolverFcn precond , HYPRE_PtrToStructSolverFcn precond_setup , HYPRE_StructSolver precond_solver ); HYPRE_Int HYPRE_StructHybridSetLogging ( HYPRE_StructSolver solver , HYPRE_Int logging ); HYPRE_Int HYPRE_StructHybridSetPrintLevel ( HYPRE_StructSolver solver , HYPRE_Int print_level ); HYPRE_Int HYPRE_StructHybridGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_its ); HYPRE_Int HYPRE_StructHybridGetDSCGNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *dscg_num_its ); HYPRE_Int HYPRE_StructHybridGetPCGNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *pcg_num_its ); HYPRE_Int HYPRE_StructHybridGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); /* HYPRE_struct_int.c */ HYPRE_Int hypre_StructVectorSetRandomValues ( hypre_StructVector *vector , HYPRE_Int seed ); HYPRE_Int hypre_StructSetRandomValues ( void *v , HYPRE_Int seed ); HYPRE_Int HYPRE_StructSetupInterpreter ( mv_InterfaceInterpreter *i ); HYPRE_Int HYPRE_StructSetupMatvec ( HYPRE_MatvecFunctions *mv ); /* HYPRE_struct_jacobi.c */ HYPRE_Int HYPRE_StructJacobiCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); HYPRE_Int HYPRE_StructJacobiDestroy ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructJacobiSetup ( HYPRE_StructSolver 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 ); HYPRE_Int HYPRE_StructJacobiSetTol ( HYPRE_StructSolver solver , HYPRE_Real tol ); HYPRE_Int HYPRE_StructJacobiGetTol ( HYPRE_StructSolver solver , HYPRE_Real *tol ); HYPRE_Int HYPRE_StructJacobiSetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int max_iter ); HYPRE_Int HYPRE_StructJacobiGetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int *max_iter ); HYPRE_Int HYPRE_StructJacobiSetZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructJacobiGetZeroGuess ( HYPRE_StructSolver solver , HYPRE_Int *zeroguess ); HYPRE_Int HYPRE_StructJacobiSetNonZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructJacobiGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_StructJacobiGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); /* HYPRE_struct_lgmres.c */ HYPRE_Int HYPRE_StructLGMRESCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); 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 print_level ); HYPRE_Int HYPRE_StructLGMRESGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_StructLGMRESGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); /* HYPRE_struct_pcg.c */ HYPRE_Int HYPRE_StructPCGCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); 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 print_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_StructDiagScaleSetup ( HYPRE_StructSolver solver , HYPRE_StructMatrix A , HYPRE_StructVector y , HYPRE_StructVector x ); HYPRE_Int HYPRE_StructDiagScale ( HYPRE_StructSolver solver , HYPRE_StructMatrix HA , HYPRE_StructVector Hy , HYPRE_StructVector Hx ); /* HYPRE_struct_pfmg.c */ HYPRE_Int HYPRE_StructPFMGCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); HYPRE_Int HYPRE_StructPFMGDestroy ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructPFMGSetup ( HYPRE_StructSolver 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 ); HYPRE_Int HYPRE_StructPFMGSetTol ( HYPRE_StructSolver solver , HYPRE_Real tol ); HYPRE_Int HYPRE_StructPFMGGetTol ( HYPRE_StructSolver solver , HYPRE_Real *tol ); HYPRE_Int HYPRE_StructPFMGSetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int max_iter ); HYPRE_Int HYPRE_StructPFMGGetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int *max_iter ); HYPRE_Int HYPRE_StructPFMGSetMaxLevels ( HYPRE_StructSolver solver , HYPRE_Int max_levels ); HYPRE_Int HYPRE_StructPFMGGetMaxLevels ( HYPRE_StructSolver solver , HYPRE_Int *max_levels ); HYPRE_Int HYPRE_StructPFMGSetRelChange ( HYPRE_StructSolver solver , HYPRE_Int rel_change ); HYPRE_Int HYPRE_StructPFMGGetRelChange ( HYPRE_StructSolver solver , HYPRE_Int *rel_change ); HYPRE_Int HYPRE_StructPFMGSetZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructPFMGGetZeroGuess ( HYPRE_StructSolver solver , HYPRE_Int *zeroguess ); HYPRE_Int HYPRE_StructPFMGSetNonZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructPFMGSetRelaxType ( HYPRE_StructSolver solver , HYPRE_Int relax_type ); HYPRE_Int HYPRE_StructPFMGGetRelaxType ( HYPRE_StructSolver solver , HYPRE_Int *relax_type ); HYPRE_Int HYPRE_StructPFMGSetJacobiWeight ( HYPRE_StructSolver solver , HYPRE_Real weight ); HYPRE_Int HYPRE_StructPFMGGetJacobiWeight ( HYPRE_StructSolver solver , HYPRE_Real *weight ); HYPRE_Int HYPRE_StructPFMGSetRAPType ( HYPRE_StructSolver solver , HYPRE_Int rap_type ); HYPRE_Int HYPRE_StructPFMGGetRAPType ( HYPRE_StructSolver solver , HYPRE_Int *rap_type ); HYPRE_Int HYPRE_StructPFMGSetNumPreRelax ( HYPRE_StructSolver solver , HYPRE_Int num_pre_relax ); HYPRE_Int HYPRE_StructPFMGGetNumPreRelax ( HYPRE_StructSolver solver , HYPRE_Int *num_pre_relax ); HYPRE_Int HYPRE_StructPFMGSetNumPostRelax ( HYPRE_StructSolver solver , HYPRE_Int num_post_relax ); HYPRE_Int HYPRE_StructPFMGGetNumPostRelax ( HYPRE_StructSolver solver , HYPRE_Int *num_post_relax ); HYPRE_Int HYPRE_StructPFMGSetSkipRelax ( HYPRE_StructSolver solver , HYPRE_Int skip_relax ); HYPRE_Int HYPRE_StructPFMGGetSkipRelax ( HYPRE_StructSolver solver , HYPRE_Int *skip_relax ); HYPRE_Int HYPRE_StructPFMGSetDxyz ( HYPRE_StructSolver solver , HYPRE_Real *dxyz ); HYPRE_Int HYPRE_StructPFMGSetLogging ( HYPRE_StructSolver solver , HYPRE_Int logging ); HYPRE_Int HYPRE_StructPFMGGetLogging ( HYPRE_StructSolver solver , HYPRE_Int *logging ); HYPRE_Int HYPRE_StructPFMGSetPrintLevel ( HYPRE_StructSolver solver , HYPRE_Int print_level ); HYPRE_Int HYPRE_StructPFMGGetPrintLevel ( HYPRE_StructSolver solver , HYPRE_Int *print_level ); HYPRE_Int HYPRE_StructPFMGGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_StructPFMGGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); HYPRE_Int hypre_PFMGSetDeviceLevel( void *pfmg_vdata, HYPRE_Int device_level ); /* HYPRE_struct_smg.c */ HYPRE_Int HYPRE_StructSMGCreate ( MPI_Comm comm , HYPRE_StructSolver *solver ); HYPRE_Int HYPRE_StructSMGDestroy ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructSMGSetup ( HYPRE_StructSolver 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 ); HYPRE_Int HYPRE_StructSMGSetMemoryUse ( HYPRE_StructSolver solver , HYPRE_Int memory_use ); HYPRE_Int HYPRE_StructSMGGetMemoryUse ( HYPRE_StructSolver solver , HYPRE_Int *memory_use ); HYPRE_Int HYPRE_StructSMGSetTol ( HYPRE_StructSolver solver , HYPRE_Real tol ); HYPRE_Int HYPRE_StructSMGGetTol ( HYPRE_StructSolver solver , HYPRE_Real *tol ); HYPRE_Int HYPRE_StructSMGSetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int max_iter ); HYPRE_Int HYPRE_StructSMGGetMaxIter ( HYPRE_StructSolver solver , HYPRE_Int *max_iter ); HYPRE_Int HYPRE_StructSMGSetRelChange ( HYPRE_StructSolver solver , HYPRE_Int rel_change ); HYPRE_Int HYPRE_StructSMGGetRelChange ( HYPRE_StructSolver solver , HYPRE_Int *rel_change ); HYPRE_Int HYPRE_StructSMGSetZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructSMGGetZeroGuess ( HYPRE_StructSolver solver , HYPRE_Int *zeroguess ); HYPRE_Int HYPRE_StructSMGSetNonZeroGuess ( HYPRE_StructSolver solver ); HYPRE_Int HYPRE_StructSMGSetNumPreRelax ( HYPRE_StructSolver solver , HYPRE_Int num_pre_relax ); HYPRE_Int HYPRE_StructSMGGetNumPreRelax ( HYPRE_StructSolver solver , HYPRE_Int *num_pre_relax ); HYPRE_Int HYPRE_StructSMGSetNumPostRelax ( HYPRE_StructSolver solver , HYPRE_Int num_post_relax ); HYPRE_Int HYPRE_StructSMGGetNumPostRelax ( HYPRE_StructSolver solver , HYPRE_Int *num_post_relax ); HYPRE_Int HYPRE_StructSMGSetLogging ( HYPRE_StructSolver solver , HYPRE_Int logging ); HYPRE_Int HYPRE_StructSMGGetLogging ( HYPRE_StructSolver solver , HYPRE_Int *logging ); HYPRE_Int HYPRE_StructSMGSetPrintLevel ( HYPRE_StructSolver solver , HYPRE_Int print_level ); HYPRE_Int HYPRE_StructSMGGetPrintLevel ( HYPRE_StructSolver solver , HYPRE_Int *print_level ); HYPRE_Int HYPRE_StructSMGGetNumIterations ( HYPRE_StructSolver solver , HYPRE_Int *num_iterations ); HYPRE_Int HYPRE_StructSMGGetFinalRelativeResidualNorm ( HYPRE_StructSolver solver , HYPRE_Real *norm ); HYPRE_Int hypre_StructSMGSetDeviceLevel( void *smg_vdata, HYPRE_Int device_level); /* HYPRE_struct_sparse_msg.c */ 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 ); /* 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 ( HYPRE_Int count , HYPRE_Int elt_size ); 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.18.2/src/struct_ls/coarsen.c000066400000000000000000000277261355566575400174050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_ls/cyclic_reduction.c000066400000000000000000001274231355566575400212700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" #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_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); 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; 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_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}; #if defined(HYPRE_USING_CUDA) HYPRE_Int data_location = 0; #endif /*----------------------------------------------------- * 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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, HYPRE_MEMORY_DEVICE); data_const = hypre_CTAlloc(HYPRE_Real,data_size_const,HYPRE_MEMORY_HOST); (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 defined(HYPRE_USING_CUDA) 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_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, HYPRE_MEMORY_DEVICE); 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.18.2/src/struct_ls/general.c000066400000000000000000000014701355566575400173540ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/struct_ls/headers000077500000000000000000000025301355566575400171320ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <<@ #include "_hypre_utilities.h" #include "HYPRE_struct_ls.h" #ifndef hypre_STRUCT_LS_HEADER #define hypre_STRUCT_LS_HEADER #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 #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/struct_ls/hybrid.c000066400000000000000000000746011355566575400172260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 ) { 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_CAlloc, 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_CAlloc, 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.18.2/src/struct_ls/jacobi.c000066400000000000000000000151461355566575400171730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/pcg_struct.c000066400000000000000000000167001355566575400201160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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( HYPRE_Int count, HYPRE_Int elt_size ) { return ( (void*) hypre_CTAlloc(char, count * elt_size, HYPRE_MEMORY_HOST) ); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovFree( void *ptr ) { hypre_Free( 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 ) { return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructKrylovIdentity( void *vdata, void *A, void *b, void *x ) { 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.18.2/src/struct_ls/pfmg.c000066400000000000000000000401501355566575400166660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; /* initialize */ (pfmg_data -> num_levels) = -1; #if defined(HYPRE_USING_CUDA) (pfmg_data -> devicelevel) = 200; #endif return (void *) pfmg_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_PFMGDestroy( void *pfmg_vdata ) { hypre_PFMGData *pfmg_data = (hypre_PFMGData *)pfmg_vdata; HYPRE_Int l; HYPRE_ANNOTATION_BEGIN("PFMG.destroy"); 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); } 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, HYPRE_MEMORY_DEVICE); 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_ANNOTATION_END("PFMG.destroy"); 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 defined(HYPRE_USING_CUDA) 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.18.2/src/struct_ls/pfmg.h000066400000000000000000000056271355566575400167050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include /*-------------------------------------------------------------------------- * 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_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 defined(HYPRE_USING_CUDA) HYPRE_Int devicelevel; #endif } hypre_PFMGData; #endif hypre-2.18.2/src/struct_ls/pfmg2_setup_rap.c000066400000000000000000002542721355566575400210460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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.18.2/src/struct_ls/pfmg3_setup_rap.c000066400000000000000000006446631355566575400210560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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.18.2/src/struct_ls/pfmg_relax.c000066400000000000000000000221201355566575400200560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/pfmg_setup.c000066400000000000000000002231671355566575400201210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #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 defined(HYPRE_USING_CUDA) HYPRE_Int num_level_GPU = 0; HYPRE_Int data_location = 0; HYPRE_Int max_box_size = 0; HYPRE_Int device_level = (pfmg_data -> devicelevel); HYPRE_Int myrank; hypre_MPI_Comm_rank(comm, &myrank ); #endif #if DEBUG char filename[255]; #endif HYPRE_ANNOTATION_BEGIN("PFMG.setup"); /*----------------------------------------------------- * 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++) { deviation[d] -= mean[d]*mean[d]; /* square of coeff. of variation */ if (deviation[d]/(mean[d]*mean[d]) > .1) { 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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, HYPRE_MEMORY_DEVICE); data_const = hypre_CTAlloc(HYPRE_Real, data_size_const, HYPRE_MEMORY_HOST); #if defined(HYPRE_USING_CUDA) //hypre_printf("num_level_GPU = %d,device_level = %d / %d\n",num_level_GPU,device_level,num_levels); #endif (pfmg_data -> data) = data; (pfmg_data -> data_const) = data_const; #if defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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++) { #if defined(HYPRE_USING_CUDA) 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); } #if defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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_ANNOTATION_END("PFMG.setup"); 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) { cxyz_max = 1.0; } for (d = 0; d < 3; d++) { if (cxyz[d] > 0) { cxyz[d] /= cxyz_max; dxyz[d] = sqrt(1.0 / cxyz[d]); } else { dxyz[d] = HYPRE_REAL_MAX/1000; } } 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; 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, HYPRE_MEMORY_DEVICE); } 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 defined(HYPRE_USING_CUDA) //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 IN ONE BOXLOOP ? #if defined(HYPRE_USING_KOKKOS) 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 /* kokkos */ #if defined(HYPRE_USING_RAJA) ReduceSum cxb(cxyz[0]),cyb(cxyz[1]),sqcxb(sqcxyz[0]),sqcyb(sqcxyz[1]); #elif defined(HYPRE_USING_CUDA) 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) 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) 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 defined(HYPRE_USING_CUDA) //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) 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) 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) 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) 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 defined(HYPRE_USING_CUDA) //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) 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) 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) 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) 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 defined(HYPRE_USING_CUDA) //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) 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) 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) 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) 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 defined(HYPRE_USING_CUDA) //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) HYPRE_Real cxb = cxyz[0]; hypre_BoxLoop1ReductionBegin(hypre_StructMatrixNDim(A), loop_size, A_dbox, start, stride, Ai, cxb) { HYPRE_Real tcx; 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; 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; 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; 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; 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; 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) 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, tcy = 0, tcz = 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) 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) 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 defined(HYPRE_USING_CUDA) //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) HYPRE_Real diag_product_local = diag_product; #elif defined(HYPRE_USING_RAJA) ReduceSum diag_product_local(diag_product); #elif defined(HYPRE_USING_CUDA) 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.18.2/src/struct_ls/pfmg_setup_interp.c000066400000000000000000001731471355566575400215040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #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 *----------------------------------------------------------*/ 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 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; #if defined(HYPRE_USING_CUDA) HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); #endif HYPRE_Int **data_indices = hypre_StructMatrixDataIndices(A); HYPRE_Complex *matrixA_data = hypre_StructMatrixData(A); HYPRE_Int *data_indices_boxi_d; /* On device */ hypre_Index *stencil_shape_d; #if (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) data_indices_boxi_d = hypre_TAlloc(HYPRE_Int, stencil_size, HYPRE_MEMORY_DEVICE); stencil_shape_d = hypre_TAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(data_indices_boxi_d, data_indices[i], HYPRE_Int, stencil_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(stencil_shape_d, stencil_shape, hypre_Index, stencil_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #else data_indices_boxi_d = data_indices[i]; stencil_shape_d = stencil_shape; #endif #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 defined(HYPRE_USING_CUDA) 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 (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) hypre_TFree(data_indices_boxi_d, HYPRE_MEMORY_DEVICE); hypre_TFree(stencil_shape_d, HYPRE_MEMORY_DEVICE); #endif 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; #if defined(HYPRE_USING_CUDA) //What TODO? HYPRE_Int data_location = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); #endif for (dim = 0; dim < hypre_StructMatrixNDim(A); dim++) { loop_length *= loop_size[dim]; } center = hypre_CTAlloc(HYPRE_Real, loop_length, HYPRE_MEMORY_DEVICE); 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, HYPRE_MEMORY_DEVICE); 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_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_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: 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_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: 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_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: 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_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: 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: 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: 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_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: 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_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: 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.18.2/src/struct_ls/pfmg_setup_rap.c000066400000000000000000000206571355566575400207620ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 defined(HYPRE_USING_CUDA) HYPRE_Int data_location_A = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); HYPRE_Int 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); 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 defined(HYPRE_USING_CUDA) 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_exec_policy = data_location_Ac; hypre_StructGridDataLocation(hypre_StructMatrixGrid(Ac)) = data_location_Ac; hypre_StructMatrixAssemble(Ac); hypre_exec_policy = data_location_A; hypre_StructMatrixDestroy(Ac_tmp); } #endif return hypre_error_flag; } hypre-2.18.2/src/struct_ls/pfmg_setup_rap5.c000066400000000000000000000411711355566575400210410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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.18.2/src/struct_ls/pfmg_setup_rap7.c000066400000000000000000000442031355566575400210420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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.18.2/src/struct_ls/pfmg_solve.c000066400000000000000000000302731355566575400201030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_ANNOTATION_BEGIN("PFMG.solve"); 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_ANNOTATION_END("PFMG.solve"); 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_ANNOTATION_END("PFMG.solve"); 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 *--------------------------------------------------*/ if (constant_coefficient) { hypre_StructVectorClearAllValues(r_l[0]); } /* fine grid pre-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; /* compute fine grid residual (b - Ax) */ 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]); /* convergence check */ if (tol > 0.0) { r_dot_r = hypre_StructInnerProd(r_l[0], r_l[0]); if (logging > 0) { norms[i] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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], 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 for (l = 1; l <= (num_levels - 2); l++) { #if defined(HYPRE_USING_CUDA) 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_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]); /* compute residual (b - Ax) */ 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]); } 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 } /*-------------------------------------------------- * Bottom *--------------------------------------------------*/ if (active_l[l]) { hypre_PFMGRelaxSetZeroGuess(relax_data_l[l], 1); hypre_PFMGRelax(relax_data_l[l], A_l[l], b_l[l], x_l[l]); } 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 defined(HYPRE_USING_CUDA) 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]); #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 if (active_l[l]) { /* post-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]); } } #if defined(HYPRE_USING_CUDA) 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]); #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 } /* 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 */ 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]); (pfmg_data -> num_iterations) = (i + 1); } hypre_EndTiming(pfmg_data -> time_index); HYPRE_ANNOTATION_END("PFMG.solve"); return hypre_error_flag; } hypre-2.18.2/src/struct_ls/point_relax.c000066400000000000000000001515251355566575400202720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /* 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, 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/bsumsq0.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/bsumsq0.0 ) { hypre_StructMatvecDestroy( matvec_data ); } if ( tol>0.0 ) (relax_data -> rresnorm) = 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_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]]); case 6: Ap5 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[5]); xoff5 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[5]]); case 5: Ap4 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[4]); xoff4 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[4]]); case 4: Ap3 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[3]); xoff3 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[3]]); case 3: Ap2 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[2]); xoff2 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[2]]); case 2: Ap1 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[1]); xoff1 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[1]]); case 1: Ap0 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[0]); xoff0 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[0]]); 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_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]]); case 6: Ap5 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[5]); xoff5 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[5]]); case 5: Ap4 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[4]); xoff4 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[4]]); case 4: Ap3 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[3]); xoff3 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[3]]); case 3: Ap2 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[2]); xoff2 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[2]]); case 2: Ap1 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[1]); xoff1 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[1]]); case 1: Ap0 = hypre_StructMatrixBoxData(A, boxarray_id, ssi[0]); xoff0 = hypre_BoxOffsetDistance( x_data_box, stencil_shape[ssi[0]]); 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.18.2/src/struct_ls/red_black_constantcoef_gs.c000066400000000000000000000424021355566575400231040ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 "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, xoff1, xoff2, xoff3, xoff4, xoff5; HYPRE_Real *Ap; HYPRE_Real *App; HYPRE_Real *bp; HYPRE_Real *xp; /* constant coefficient */ HYPRE_Int constant_coeff= hypre_StructMatrixConstantCoefficient(A); HYPRE_Real App0, App1, App2, App3, App4, App5, AApd; 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]]); 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]]); 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.18.2/src/struct_ls/red_black_gs.c000066400000000000000000000450111355566575400203350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "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]]); 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]]); 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.18.2/src/struct_ls/red_black_gs.h000066400000000000000000000306301355566575400203430ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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) #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_exec_policy,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_exec_policy,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_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 < 3; 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; } 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.18.2/src/struct_ls/semi_interp.c000066400000000000000000000303641355566575400202610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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( ) { 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_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 *----------------------------------------------------------*/ 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)); 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_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 defined(HYPRE_USING_CUDA) HYPRE_Int data_location_f = hypre_StructGridDataLocation(fgrid); HYPRE_Int 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 defined(HYPRE_USING_CUDA) 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); 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.18.2/src/struct_ls/semi_restrict.c000066400000000000000000000266351355566575400206250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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( ) { 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_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 *----------------------------------------------------------*/ 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)); 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_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 defined(HYPRE_USING_CUDA) HYPRE_Int data_location_f = hypre_StructGridDataLocation(fgrid); HYPRE_Int 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 defined(HYPRE_USING_CUDA) 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); 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.18.2/src/struct_ls/semi_setup_rap.c000066400000000000000000001050011355566575400207510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 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_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; 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.18.2/src/struct_ls/smg.c000066400000000000000000000361611355566575400165320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ 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; /* initialize */ (smg_data -> num_levels) = -1; #if defined(HYPRE_USING_CUDA) (smg_data -> devicelevel) = 200; #endif return (void *) smg_data; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ HYPRE_Int hypre_SMGDestroy( void *smg_vdata ) { hypre_SMGData *smg_data = (hypre_SMGData *)smg_vdata; HYPRE_Int l; HYPRE_ANNOTATION_BEGIN("SMG.destroy"); 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); } 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, HYPRE_MEMORY_DEVICE); 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_ANNOTATION_END("SMG.destroy"); 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 defined(HYPRE_USING_CUDA) 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.18.2/src/struct_ls/smg.h000066400000000000000000000071101355566575400165270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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; #if defined(HYPRE_USING_CUDA) HYPRE_Int devicelevel; #endif } 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.18.2/src/struct_ls/smg2_setup_rap.c000066400000000000000000001043031355566575400206700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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, *a_cse, *a_cnw; 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, *a_cnw, *a_cne; 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_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_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.18.2/src/struct_ls/smg3_setup_rap.c000066400000000000000000002342121355566575400206740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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_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 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, *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 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_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, *rap_bse, *rap_bnw, *rap_bne; HYPRE_Real *rap_csw, *rap_cse; 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_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.18.2/src/struct_ls/smg_axpy.c000066400000000000000000000040741355566575400175710ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/struct_ls/smg_relax.c000066400000000000000000000772301355566575400177270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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_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_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.18.2/src/struct_ls/smg_residual.c000066400000000000000000000251271355566575400204220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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( ) { 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.18.2/src/struct_ls/smg_residual_unrolled.c000066400000000000000000001135131355566575400223230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_ls/smg_setup.c000066400000000000000000000527461355566575400177610ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 #if defined(HYPRE_USING_CUDA) HYPRE_Int num_level_GPU = 0; HYPRE_Int data_location = 0; HYPRE_Int max_box_size = 0; HYPRE_Int device_level = (smg_data -> devicelevel); #endif /*----------------------------------------------------- * Set up coarsening direction *-----------------------------------------------------*/ HYPRE_ANNOTATION_BEGIN("SMG.setup"); 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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, HYPRE_MEMORY_DEVICE); data_const = hypre_CTAlloc(HYPRE_Real,data_size_const,HYPRE_MEMORY_HOST); //printf("data =%d,data_const=%d,data_location = %d\n",data_size,data_size_const,data_location); (smg_data -> data) = data; (smg_data -> data_const) = data_const; #if defined(HYPRE_USING_CUDA) //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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 #if defined(HYPRE_USING_CUDA) if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { hypre_SetDeviceOn(); } #endif HYPRE_ANNOTATION_END("SMG.setup"); return hypre_error_flag; } hypre-2.18.2/src/struct_ls/smg_setup_interp.c000066400000000000000000000247421355566575400213350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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.18.2/src/struct_ls/smg_setup_rap.c000066400000000000000000000156431355566575400206160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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 defined(HYPRE_USING_CUDA) HYPRE_Int data_location_A = hypre_StructGridDataLocation(hypre_StructMatrixGrid(A)); HYPRE_Int 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 defined(HYPRE_USING_CUDA) 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.18.2/src/struct_ls/smg_setup_restrict.c000066400000000000000000000024441355566575400216660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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 ) { return hypre_error_flag; } hypre-2.18.2/src/struct_ls/smg_solve.c000066400000000000000000000276771355566575400177560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_ANNOTATION_BEGIN("SMG.solve"); 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_ANNOTATION_END("SMG.solve"); 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_ANNOTATION_END("SMG.solve"); 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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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_ANNOTATION_END("SMG.solve"); return hypre_error_flag; } hypre-2.18.2/src/struct_ls/sparse_msg.c000066400000000000000000000341651355566575400201110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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); } #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.18.2/src/struct_ls/sparse_msg.h000066400000000000000000000065371355566575400201200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/struct_ls/sparse_msg2_setup_rap.c000066400000000000000000000757601355566575400222630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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, *a_cse, *a_cnw; 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, *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 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.18.2/src/struct_ls/sparse_msg3_setup_rap.c000066400000000000000000001675521355566575400222650ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" /*-------------------------------------------------------------------------- * 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_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, *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 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, *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 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.18.2/src/struct_ls/sparse_msg_filter.c000066400000000000000000000410271355566575400214510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #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_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; /*---------------------------------------------------------- * 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 (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) HYPRE_Int nboxes = hypre_BoxArraySize(compute_boxes); data_indices_d = hypre_TAlloc(HYPRE_Int, stencil_size*nboxes, HYPRE_MEMORY_DEVICE); stencil_shape_d = hypre_TAlloc(hypre_Index, stencil_size, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(data_indices_d, data_indices[0], HYPRE_Int, stencil_size*nboxes, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); hypre_TMemcpy(stencil_shape_d, stencil_shape, hypre_Index, stencil_size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); #else data_indices_d = data_indices[0]; stencil_shape_d = stencil_shape; #endif 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 (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) hypre_TFree(data_indices_d, HYPRE_MEMORY_DEVICE); hypre_TFree(stencil_shape_d, HYPRE_MEMORY_DEVICE); #endif 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_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.18.2/src/struct_ls/sparse_msg_interp.c000066400000000000000000000235611355566575400214700ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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( ) { 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_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.18.2/src/struct_ls/sparse_msg_restrict.c000066400000000000000000000220611355566575400220200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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( ) { 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_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.18.2/src/struct_ls/sparse_msg_setup.c000066400000000000000000000723651355566575400213350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; #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, pow(2, ly), pow(2, 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, pow(2, 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, HYPRE_MEMORY_DEVICE); (smsg_data -> data) = data; 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, pow(2, ly), pow(2, 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, pow(2, lx), 1, pow(2, 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, pow(2, lx), pow(2, 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.18.2/src/struct_ls/sparse_msg_setup_rap.c000066400000000000000000000077731355566575400222000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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; 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.18.2/src/struct_ls/sparse_msg_solve.c000066400000000000000000000436421355566575400213210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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, r_dot_r, eps; HYPRE_Real e_dot_e, x_dot_x; 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] = sqrt(r_dot_r); if (b_dot_b > 0) rel_norms[i] = 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.18.2/src/struct_mv/000077500000000000000000000000001355566575400155755ustar00rootroot00000000000000hypre-2.18.2/src/struct_mv/CMakeLists.txt000066400000000000000000000017621355566575400203430ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/struct_mv/F90_HYPRE_struct_grid.c000066400000000000000000000072721355566575400216670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/F90_HYPRE_struct_matrix.c000066400000000000000000000270361355566575400222460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/F90_HYPRE_struct_stencil.c000066400000000000000000000043731355566575400224020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/F90_HYPRE_struct_vector.c000066400000000000000000000255601355566575400222440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/HYPRE_struct_grid.c000066400000000000000000000070161355566575400212450ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 defined(HYPRE_USING_CUDA) HYPRE_Int HYPRE_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_Int data_location ) { return ( hypre_StructGridSetDataLocation(grid, data_location) ); } #endif hypre-2.18.2/src/struct_mv/HYPRE_struct_matrix.c000066400000000000000000000371261355566575400216310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/struct_mv/HYPRE_struct_mv.h000066400000000000000000000522151355566575400207500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Struct System Interface * * This interface represents a structured-grid conceptual view of a linear * system. * * @memo A structured-grid conceptual interface **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @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 {\tt 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 {\tt periodic} is an {\tt 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 {\tt * 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 {\tt values} array is of length * {\tt 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 {\tt values} array is of * length {\tt 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 {\tt values} * array is of length {\tt 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 {\tt * values} array is of length {\tt 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 {\tt values} is ordered * as follows: * \begin{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++; } \end{verbatim} **/ 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 {\tt 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 {\tt values} array is logically * box shaped with value-box extents {\tt vilower} and {\tt viupper} that must * contain the set-box extents {\tt ilower} and {\tt iupper} . The data in the * {\tt 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 {\tt 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 {\tt values} array is of length * {\tt 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 {\tt 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 {\tt 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: * \begin{itemize} * \item no entries constant (this function need not be called) * \item all entries constant * \item all but the diagonal entry constant * \end{itemize} **/ 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); /** * Matvec operator. This operation is $y = \alpha A x + \beta y$ . * Note that you can do a simple matrix-vector multiply by setting * $\alpha=1$ and $\beta=0$. **/ 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 {\tt values} is ordered * as follows: * \begin{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++; } \end{verbatim} **/ 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 {\tt 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 {\tt values} array is logically * box shaped with value-box extents {\tt vilower} and {\tt viupper} that must * contain the set-box extents {\tt ilower} and {\tt iupper} . The data in the * {\tt 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 {\tt 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 {\tt 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 {\tt 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); /*@}*/ /*@}*/ /*-------------------------------------------------------------------------- * 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 defined(HYPRE_USING_CUDA) HYPRE_Int HYPRE_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_Int data_location ); #endif #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/struct_mv/HYPRE_struct_stencil.c000066400000000000000000000041301355566575400217530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/HYPRE_struct_vector.c000066400000000000000000000315261355566575400216250ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/struct_mv/Makefile000066400000000000000000000043561355566575400172450ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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\ 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_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 OBJS = ${FILES:.c=.o} 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 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 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 ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/struct_mv/_hypre_struct_mv.h000066400000000000000000005745711355566575400213650ustar00rootroot00000000000000 /*** 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" #if defined(HYPRE_USING_RAJA) /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER extern "C++" { #include } using namespace RAJA; 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 256 #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 */ //TODO #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 zypre_newBoxLoopSetOneBlock() #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock zypre_newBoxLoopSetOneBlock #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 #elif defined(HYPRE_USING_KOKKOS) /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER extern "C++" { #include using namespace Kokkos; } #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_newBoxLoopSetOneBlock() #define hypre_newBoxLoopGetIndex(index)\ index[0] = hypre_IndexD(local_idx, 0); index[1] = hypre_IndexD(local_idx, 1); index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock hypre_newBoxLoopSetOneBlock #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 #elif defined(HYPRE_USING_CUDA) /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #include #include #ifdef HYPRE_USING_OPENMP #include #endif #define HYPRE_LAMBDA [=] __host__ __device__ #define BLOCKSIZE 512 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 1 #define hypre_fence() /*printf("\n hypre_newBoxLoop in %s(%d) function %s\n",__FILE__,__LINE__,__FUNCTION__);*/ #else #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_Int *p = NULL; *p = 1; */ \ } \ hypre_CheckErrorDevice(cudaDeviceSynchronize()); \ } #endif /* #define hypre_reduce_policy cuda_reduce */ extern "C++" { template __global__ void forall_kernel(LOOP_BODY loop_body, HYPRE_Int length) { HYPRE_Int idx = blockDim.x * blockIdx.x + threadIdx.x; if (idx < length) { loop_body(idx); } } template void BoxLoopforall(HYPRE_Int policy, HYPRE_Int length, LOOP_BODY loop_body) { if (policy == HYPRE_MEMORY_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 (policy == HYPRE_MEMORY_DEVICE) { HYPRE_Int gridSize = (length + BLOCKSIZE - 1) / BLOCKSIZE; const dim3 gDim(gridSize), bDim(BLOCKSIZE); HYPRE_CUDA_LAUNCH( forall_kernel, gDim, bDim, loop_body, length ); } else if (policy == 2) { } } template __global__ void reductionforall_kernel(LOOP_BODY ReductionLoop, HYPRE_Int length) { ReductionLoop(blockDim.x*blockIdx.x+threadIdx.x, blockDim.x*gridDim.x, length); } template void ReductionBoxLoopforall(HYPRE_Int policy, HYPRE_Int length, LOOP_BODY ReductionLoop) { if (length <= 0) { return; } if (policy == HYPRE_MEMORY_HOST) { } else if (policy == HYPRE_MEMORY_DEVICE) { HYPRE_Int gridSize = (length + BLOCKSIZE - 1) / BLOCKSIZE; gridSize = hypre_min(gridSize, 1024); /* hypre_printf("length= %d, blocksize = %d, gridsize = %d\n", length, BLOCKSIZE, gridSize); */ const dim3 gDim(gridSize), bDim(BLOCKSIZE); HYPRE_CUDA_LAUNCH( reductionforall_kernel, gDim, bDim, ReductionLoop, length ); } } } #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_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]; #define hypre_BasicBoxLoopInit(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]; \ #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_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_newBoxLoop0End() \ }); \ hypre_fence(); \ } #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_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_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); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_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); \ BoxLoopforall(hypre_exec_policy,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_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); \ BoxLoopforall(hypre_exec_policy,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_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_newBasicBoxLoop1Begin(ndim, loop_size, \ stride1, i1) \ { \ hypre_BasicBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ #define zypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ hypre_BasicBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ zypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_LoopBegin(size,idx) \ { \ BoxLoopforall(hypre_exec_policy,size,HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); index[1] = hypre_IndexD(local_idx, 1); index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock() ; #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_BasicBoxLoop1Begin zypre_newBasicBoxLoop1Begin #define hypre_BasicBoxLoop2Begin zypre_newBasicBoxLoop2Begin /* Reduction BoxLoop1*/ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ reducesum) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ reducesum.nblocks = hypre_min( (hypre__tot+BLOCKSIZE-1)/BLOCKSIZE, 1024 ); \ ReductionBoxLoopforall(hypre_exec_policy, hypre__tot, \ HYPRE_LAMBDA (HYPRE_Int tid, HYPRE_Int nthreads, \ HYPRE_Int len) \ { \ for (HYPRE_Int idx = tid; \ idx < len; \ idx += nthreads) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ } \ reducesum.BlockReduce(); \ }); \ hypre_fence(); \ } /* Reduction BoxLoop2 */ #define hypre_BoxLoop2ReductionBegin(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); \ reducesum.nblocks = hypre_min( (hypre__tot+BLOCKSIZE-1)/BLOCKSIZE, 1024 ); \ ReductionBoxLoopforall(hypre_exec_policy, hypre__tot, \ HYPRE_LAMBDA (HYPRE_Int tid, HYPRE_Int nthreads, \ HYPRE_Int len) \ { \ for (HYPRE_Int idx = tid; \ idx < len; \ idx += nthreads) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ } \ reducesum.BlockReduce(); \ }); \ hypre_fence(); \ } #endif #elif defined(HYPRE_USING_DEVICE_OPENMP) /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #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 512 /* 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_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock() ; #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_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); \ /* !!! special for BoxLoop1: 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); #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__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); #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__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); #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__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_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++) \ { #if 0 #define hypre_LoopBegin0(size, idx) \ { \ HYPRE_Int idx, hypre__size = size; \ for (idx = 0; idx < hypre__size; idx++) \ { #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre__id_0; \ index[1] = hypre__id_1; \ index[2] = hypre__id_2; #endif /* 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 #else /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #ifdef HYPRE_USING_OPENMP #define HYPRE_BOX_REDUCTION #ifdef WIN32 #define Pragma(x) __pragma(HYPRE_XSTR(x)) #else #define Pragma(x) _Pragma(HYPRE_XSTR(x)) #endif #define OMP1 Pragma(omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #else #define OMP1 #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 zypre_newBoxLoop0Begin(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_newBoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop1Begin(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_newBoxLoop1End(i1) \ i1 += hypre__i0inc1; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop2Begin(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_newBoxLoop2End(i1, i2) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop3Begin(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_newBoxLoop3End(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_newBoxLoop4Begin(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_newBoxLoop4End(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_newBasicBoxLoop2Begin(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 hypre_LoopBegin(size,idx) \ { \ HYPRE_Int idx; \ for (idx = 0;idx < size;idx ++) \ { #define hypre_LoopEnd() \ } \ } #define hypre_newBoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock zypre_BoxLoopSetOneBlock #define hypre_BoxLoopBlock zypre_BoxLoopBlock #define hypre_BoxLoop0Begin zypre_newBoxLoop0Begin #define hypre_BoxLoop0End zypre_newBoxLoop0End #define hypre_BoxLoop1Begin zypre_newBoxLoop1Begin #define hypre_BoxLoop1End zypre_newBoxLoop1End #define hypre_BoxLoop2Begin zypre_newBoxLoop2Begin #define hypre_BoxLoop2End zypre_newBoxLoop2End #define hypre_BoxLoop3Begin zypre_newBoxLoop3Begin #define hypre_BoxLoop3End zypre_newBoxLoop3End #define hypre_BoxLoop4Begin zypre_newBoxLoop4Begin #define hypre_BoxLoop4End zypre_newBoxLoop4End #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 #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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++) /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #define hypre_SerialBoxLoop0Begin(ndim, loop_size)\ {\ zypre_BoxLoopDeclare();\ zypre_BoxLoopInit(ndim, loop_size);\ hypre_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)\ i1 += hypre__i0inc1;\ }\ zypre_BoxLoopInc1();\ i1 += hypre__ikinc1[hypre__d];\ zypre_BoxLoopInc2();\ }\ }\ } #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)\ i1 += hypre__i0inc1;\ i2 += hypre__i0inc2;\ }\ zypre_BoxLoopInc1();\ i1 += hypre__ikinc1[hypre__d];\ i2 += hypre__ikinc2[hypre__d];\ zypre_BoxLoopInc2();\ }\ }\ } #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;\ } #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 /* FIXME: Remove !!! */ /*-----------------------------------*/ #define zypre_BoxLoop0Begin(ndim, loop_size)\ {\ zypre_BoxLoopDeclare();\ zypre_BoxLoopInit(ndim, loop_size); #define zypre_BoxLoop0For()\ 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); #define zypre_BoxLoop1For(i1)\ 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); #define zypre_BoxLoop2For(i1, i2)\ 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); #define zypre_BoxLoop3For(i1, i2, i3)\ 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); #define zypre_BoxLoop4For(i1, i2, i3, i4)\ 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_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 #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); /*-----------------------------------*/ #endif /*-------------------------------------------------------------------------- * 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 /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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; #if defined(HYPRE_USING_CUDA) HYPRE_Int data_location; #endif } 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 defined(HYPRE_USING_CUDA) #define hypre_StructGridDataLocation(grid) ((grid) -> data_location) #endif /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForStructGridBoxI(i, grid) \ hypre_ForBoxI(i, hypre_StructGridBoxes(grid)) #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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, the following are not needed (may be NULL) * send_rboxnums, send_rboxes, send_transforms * * For "forward" communication, the following are not needed (may be NULL) * recv_rboxnums, recv_rboxes, recv_transforms * *--------------------------------------------------------------------------*/ 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; HYPRE_Int first_comm; /* is this the first communication? */ HYPRE_Int ndim; HYPRE_Int num_values; hypre_Index send_stride; hypre_Index recv_stride; HYPRE_Int send_bufsize; /* total send buffer size (in doubles) */ HYPRE_Int recv_bufsize; /* total recv buffer size (in doubles) */ 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; HYPRE_Int **orders; /* num_orders x num_values */ HYPRE_Int *recv_data_offsets; /* offsets into recv data (by box) */ hypre_BoxArray *recv_data_space; /* recv data dimensions (by box) */ 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_data; HYPRE_Complex **recv_buffers_data; /* 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_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_CommHandleSendBuffersDevice(comm_handle) (comm_handle -> send_buffers_data) #define hypre_CommHandleRecvBuffersDevice(comm_handle) (comm_handle -> recv_buffers_data) #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 #include /*-------------------------------------------------------------------------- * 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_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_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 1998-2019 Lawrence Livermore 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_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_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 1998-2019 Lawrence Livermore 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_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_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_StructVectorPrint ( const char *filename , HYPRE_StructVector vector , HYPRE_Int all ); 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 ); #if defined(HYPRE_USING_CUDA) HYPRE_Int hypre_StructGridGetMaxBoxSize(hypre_StructGrid *grid); HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_Int 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_StructMatrixPrint ( const char *filename , hypre_StructMatrix *matrix , HYPRE_Int all ); HYPRE_Int hypre_StructMatrixMigrate ( hypre_StructMatrix *from_matrix , hypre_StructMatrix *to_matrix ); hypre_StructMatrix *hypre_StructMatrixRead ( MPI_Comm comm , const char *filename , HYPRE_Int *num_ghost ); 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_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 ); #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/struct_mv/assumed_part.c000066400000000000000000002025301355566575400204320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; /* 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); hypre_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) / pow(wmin, ndim); rn_cube_procs = proc_count / rn_cubes; rn_cube_divs = 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) 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 = 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 = 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_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.18.2/src/struct_mv/assumed_part.h000066400000000000000000000060011355566575400204320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/box.c000066400000000000000000000563021355566575400165370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; } /*========================================================================== * 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; } /*========================================================================== * 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.18.2/src/struct_mv/box.h000066400000000000000000000521601355566575400165420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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++) /*-------------------------------------------------------------------------- * BoxLoop macros: *--------------------------------------------------------------------------*/ #define hypre_SerialBoxLoop0Begin(ndim, loop_size)\ {\ zypre_BoxLoopDeclare();\ zypre_BoxLoopInit(ndim, loop_size);\ hypre_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)\ i1 += hypre__i0inc1;\ }\ zypre_BoxLoopInc1();\ i1 += hypre__ikinc1[hypre__d];\ zypre_BoxLoopInc2();\ }\ }\ } #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)\ i1 += hypre__i0inc1;\ i2 += hypre__i0inc2;\ }\ zypre_BoxLoopInc1();\ i1 += hypre__ikinc1[hypre__d];\ i2 += hypre__ikinc2[hypre__d];\ zypre_BoxLoopInc2();\ }\ }\ } #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;\ } #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 /* FIXME: Remove !!! */ /*-----------------------------------*/ #define zypre_BoxLoop0Begin(ndim, loop_size)\ {\ zypre_BoxLoopDeclare();\ zypre_BoxLoopInit(ndim, loop_size); #define zypre_BoxLoop0For()\ 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); #define zypre_BoxLoop1For(i1)\ 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); #define zypre_BoxLoop2For(i1, i2)\ 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); #define zypre_BoxLoop3For(i1, i2, i3)\ 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); #define zypre_BoxLoop4For(i1, i2, i3, i4)\ 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_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 #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); /*-----------------------------------*/ #endif /*-------------------------------------------------------------------------- * 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 hypre-2.18.2/src/struct_mv/box_algebra.c000066400000000000000000000512531355566575400202140ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/box_boundary.c000066400000000000000000000164631355566575400204460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/box_manager.c000066400000000000000000002776571355566575400202530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_Free((char *)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. */ #ifdef HYPRE_NO_GLOBAL_PARTITION non_ap_gather = 0; #else non_ap_gather = 1; #endif /* 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 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 */ #ifdef HYPRE_NO_GLOBAL_PARTITION { /* 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; } } #endif /*------------------------------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_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_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.18.2/src/struct_mv/box_manager.h000066400000000000000000000227511355566575400202370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/boxloop.h000066400000000000000000000415371355566575400174420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #ifdef HYPRE_USING_OPENMP #define HYPRE_BOX_REDUCTION #ifdef WIN32 #define Pragma(x) __pragma(HYPRE_XSTR(x)) #else #define Pragma(x) _Pragma(HYPRE_XSTR(x)) #endif #define OMP1 Pragma(omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE) #else #define OMP1 #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 zypre_newBoxLoop0Begin(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_newBoxLoop0End() \ } \ zypre_BoxLoopInc1(); \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop1Begin(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_newBoxLoop1End(i1) \ i1 += hypre__i0inc1; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop2Begin(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_newBoxLoop2End(i1, i2) \ i1 += hypre__i0inc1; \ i2 += hypre__i0inc2; \ } \ zypre_BoxLoopInc1(); \ i1 += hypre__ikinc1[hypre__d]; \ i2 += hypre__ikinc2[hypre__d]; \ zypre_BoxLoopInc2(); \ } \ } \ } #define zypre_newBoxLoop3Begin(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_newBoxLoop3End(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_newBoxLoop4Begin(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_newBoxLoop4End(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_newBasicBoxLoop2Begin(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 hypre_LoopBegin(size,idx) \ { \ HYPRE_Int idx; \ for (idx = 0;idx < size;idx ++) \ { #define hypre_LoopEnd() \ } \ } #define hypre_newBoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock zypre_BoxLoopSetOneBlock #define hypre_BoxLoopBlock zypre_BoxLoopBlock #define hypre_BoxLoop0Begin zypre_newBoxLoop0Begin #define hypre_BoxLoop0End zypre_newBoxLoop0End #define hypre_BoxLoop1Begin zypre_newBoxLoop1Begin #define hypre_BoxLoop1End zypre_newBoxLoop1End #define hypre_BoxLoop2Begin zypre_newBoxLoop2Begin #define hypre_BoxLoop2End zypre_newBoxLoop2End #define hypre_BoxLoop3Begin zypre_newBoxLoop3Begin #define hypre_BoxLoop3End zypre_newBoxLoop3End #define hypre_BoxLoop4Begin zypre_newBoxLoop4Begin #define hypre_BoxLoop4End zypre_newBoxLoop4End #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 hypre-2.18.2/src/struct_mv/boxloop_cuda.h000066400000000000000000000532501355566575400204310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #include #include #ifdef HYPRE_USING_OPENMP #include #endif #define HYPRE_LAMBDA [=] __host__ __device__ #define BLOCKSIZE 512 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 1 #define hypre_fence() /*printf("\n hypre_newBoxLoop in %s(%d) function %s\n",__FILE__,__LINE__,__FUNCTION__);*/ #else #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_Int *p = NULL; *p = 1; */ \ } \ hypre_CheckErrorDevice(cudaDeviceSynchronize()); \ } #endif /* #define hypre_reduce_policy cuda_reduce */ extern "C++" { template __global__ void forall_kernel(LOOP_BODY loop_body, HYPRE_Int length) { HYPRE_Int idx = blockDim.x * blockIdx.x + threadIdx.x; if (idx < length) { loop_body(idx); } } template void BoxLoopforall(HYPRE_Int policy, HYPRE_Int length, LOOP_BODY loop_body) { if (policy == HYPRE_MEMORY_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 (policy == HYPRE_MEMORY_DEVICE) { HYPRE_Int gridSize = (length + BLOCKSIZE - 1) / BLOCKSIZE; const dim3 gDim(gridSize), bDim(BLOCKSIZE); HYPRE_CUDA_LAUNCH( forall_kernel, gDim, bDim, loop_body, length ); } else if (policy == 2) { } } template __global__ void reductionforall_kernel(LOOP_BODY ReductionLoop, HYPRE_Int length) { ReductionLoop(blockDim.x*blockIdx.x+threadIdx.x, blockDim.x*gridDim.x, length); } template void ReductionBoxLoopforall(HYPRE_Int policy, HYPRE_Int length, LOOP_BODY ReductionLoop) { if (length <= 0) { return; } if (policy == HYPRE_MEMORY_HOST) { } else if (policy == HYPRE_MEMORY_DEVICE) { HYPRE_Int gridSize = (length + BLOCKSIZE - 1) / BLOCKSIZE; gridSize = hypre_min(gridSize, 1024); /* hypre_printf("length= %d, blocksize = %d, gridsize = %d\n", length, BLOCKSIZE, gridSize); */ const dim3 gDim(gridSize), bDim(BLOCKSIZE); HYPRE_CUDA_LAUNCH( reductionforall_kernel, gDim, bDim, ReductionLoop, length ); } } } #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_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]; #define hypre_BasicBoxLoopInit(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]; \ #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_newBoxLoop0Begin(ndim, loop_size) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_newBoxLoop0End() \ }); \ hypre_fence(); \ } #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_newBoxLoop1Begin(ndim, loop_size, \ dbox1, start1, stride1, i1) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_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); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_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); \ BoxLoopforall(hypre_exec_policy,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_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); \ BoxLoopforall(hypre_exec_policy,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_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_newBasicBoxLoop1Begin(ndim, loop_size, \ stride1, i1) \ { \ hypre_BasicBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ #define zypre_newBasicBoxLoop2Begin(ndim, loop_size, \ stride1, i1, \ stride2, i2) \ { \ hypre_BasicBoxLoopInit(ndim,loop_size); \ zypre_BasicBoxLoopDataDeclareK(1,ndim,loop_size,stride1); \ zypre_BasicBoxLoopDataDeclareK(2,ndim,loop_size,stride2); \ BoxLoopforall(hypre_exec_policy,hypre__tot,HYPRE_LAMBDA (HYPRE_Int idx) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); \ #define hypre_LoopBegin(size,idx) \ { \ BoxLoopforall(hypre_exec_policy,size,HYPRE_LAMBDA (HYPRE_Int idx) \ { #define hypre_LoopEnd() \ }); \ hypre_fence(); \ } #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); index[1] = hypre_IndexD(local_idx, 1); index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock() ; #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_BasicBoxLoop1Begin zypre_newBasicBoxLoop1Begin #define hypre_BasicBoxLoop2Begin zypre_newBasicBoxLoop2Begin /* Reduction BoxLoop1*/ #define hypre_BoxLoop1ReductionBegin(ndim, loop_size, \ dbox1, start1, stride1, i1, \ reducesum) \ { \ hypre_newBoxLoopInit(ndim,loop_size); \ hypre_BoxLoopDataDeclareK(1,ndim,loop_size,dbox1,start1,stride1); \ reducesum.nblocks = hypre_min( (hypre__tot+BLOCKSIZE-1)/BLOCKSIZE, 1024 ); \ ReductionBoxLoopforall(hypre_exec_policy, hypre__tot, \ HYPRE_LAMBDA (HYPRE_Int tid, HYPRE_Int nthreads, \ HYPRE_Int len) \ { \ for (HYPRE_Int idx = tid; \ idx < len; \ idx += nthreads) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); #define hypre_BoxLoop1ReductionEnd(i1, reducesum) \ } \ reducesum.BlockReduce(); \ }); \ hypre_fence(); \ } /* Reduction BoxLoop2 */ #define hypre_BoxLoop2ReductionBegin(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); \ reducesum.nblocks = hypre_min( (hypre__tot+BLOCKSIZE-1)/BLOCKSIZE, 1024 ); \ ReductionBoxLoopforall(hypre_exec_policy, hypre__tot, \ HYPRE_LAMBDA (HYPRE_Int tid, HYPRE_Int nthreads, \ HYPRE_Int len) \ { \ for (HYPRE_Int idx = tid; \ idx < len; \ idx += nthreads) \ { \ hypre_newBoxLoopDeclare(databox1); \ hypre_BoxLoopIncK(1,databox1,i1); \ hypre_BoxLoopIncK(2,databox2,i2); #define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \ } \ reducesum.BlockReduce(); \ }); \ hypre_fence(); \ } #endif hypre-2.18.2/src/struct_mv/boxloop_kokkos.h000066400000000000000000000464241355566575400210230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER extern "C++" { #include using namespace Kokkos; } #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_newBoxLoopSetOneBlock() #define hypre_newBoxLoopGetIndex(index)\ index[0] = hypre_IndexD(local_idx, 0); index[1] = hypre_IndexD(local_idx, 1); index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock hypre_newBoxLoopSetOneBlock #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 hypre-2.18.2/src/struct_mv/boxloop_omp45.h000066400000000000000000000566641355566575400204750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER #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 512 /* 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_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock() ; #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_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); \ /* !!! special for BoxLoop1: 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); #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__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); #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__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); #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__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_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++) \ { #if 0 #define hypre_LoopBegin0(size, idx) \ { \ HYPRE_Int idx, hypre__size = size; \ for (idx = 0; idx < hypre__size; idx++) \ { #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre__id_0; \ index[1] = hypre__id_1; \ index[2] = hypre__id_2; #endif /* 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 hypre-2.18.2/src/struct_mv/boxloop_raja.h000066400000000000000000000455211355566575400204340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NEWBOXLOOP_HEADER #define HYPRE_NEWBOXLOOP_HEADER extern "C++" { #include } using namespace RAJA; 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 256 #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 */ //TODO #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 zypre_newBoxLoopSetOneBlock() #define hypre_newBoxLoopGetIndex(index) \ index[0] = hypre_IndexD(local_idx, 0); \ index[1] = hypre_IndexD(local_idx, 1); \ index[2] = hypre_IndexD(local_idx, 2); #define hypre_BoxLoopGetIndex zypre_BoxLoopGetIndex #define hypre_BoxLoopSetOneBlock zypre_newBoxLoopSetOneBlock #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 hypre-2.18.2/src/struct_mv/communication_info.c000066400000000000000000001067671355566575400216420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_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; 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, 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); { hypre_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.18.2/src/struct_mv/computation.c000066400000000000000000000301551355566575400203070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/struct_mv/computation.h000066400000000000000000000053221355566575400203120ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/headers000077500000000000000000000044061355566575400171420ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 <<@ #if defined(HYPRE_USING_RAJA) @ cat boxloop_raja.h >> $INTERNAL_HEADER cat >> $INTERNAL_HEADER <<@ #elif defined(HYPRE_USING_KOKKOS) @ cat boxloop_kokkos.h >> $INTERNAL_HEADER cat >> $INTERNAL_HEADER <<@ #elif defined(HYPRE_USING_CUDA) @ cat boxloop_cuda.h >> $INTERNAL_HEADER cat >> $INTERNAL_HEADER <<@ #elif defined(HYPRE_USING_DEVICE_OPENMP) @ cat boxloop_omp45.h >> $INTERNAL_HEADER cat >> $INTERNAL_HEADER <<@ #else @ cat boxloop.h >> $INTERNAL_HEADER cat >> $INTERNAL_HEADER <<@ #endif @ 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 #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/struct_mv/project.c000066400000000000000000000065271355566575400174210ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/protos.h000066400000000000000000000706721355566575400173100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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_StructVectorPrint ( const char *filename , HYPRE_StructVector vector , HYPRE_Int all ); 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 ); #if defined(HYPRE_USING_CUDA) HYPRE_Int hypre_StructGridGetMaxBoxSize(hypre_StructGrid *grid); HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_Int 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_StructMatrixPrint ( const char *filename , hypre_StructMatrix *matrix , HYPRE_Int all ); HYPRE_Int hypre_StructMatrixMigrate ( hypre_StructMatrix *from_matrix , hypre_StructMatrix *to_matrix ); hypre_StructMatrix *hypre_StructMatrixRead ( MPI_Comm comm , const char *filename , HYPRE_Int *num_ghost ); 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_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.18.2/src/struct_mv/struct_axpy.c000066400000000000000000000040271355566575400203310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- * 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); #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 } return hypre_error_flag; } hypre-2.18.2/src/struct_mv/struct_communication.c000066400000000000000000001473521355566575400222260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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" #define DEBUG 0 #if DEBUG char filename[255]; FILE *file; #endif /* These are device buffers needed to do MPI communication * when the computations (BoxLoop) are excuted on device and the host memory * are not accessible from device * */ HYPRE_Complex* global_recv_buffer = NULL; HYPRE_Complex* global_send_buffer = NULL; HYPRE_Int global_recv_size = 0; HYPRE_Int global_send_size = 0; /* 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_IndexRef send_stride; hypre_IndexRef recv_stride; HYPRE_Int **send_processes; HYPRE_Int **recv_processes; HYPRE_Int **send_rboxnums; hypre_BoxArrayArray *send_rboxes; 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 *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); 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); 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; for (m = 0; m < num_boxes; m++) { i = comm_boxes_i[m]; j = comm_boxes_j[m]; box_array = hypre_BoxArrayArrayBoxArray(send_boxes, i); box = hypre_BoxArrayBox(box_array, j); if (hypre_BoxVolume(box) != 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; for (m = 0; m < num_boxes; m++) { i = comm_boxes_i[m]; j = comm_boxes_j[m]; box_array = hypre_BoxArrayArrayBoxArray(recv_boxes, i); box = hypre_BoxArrayBox(box_array, j); if (hypre_BoxVolume(box) != 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); } } /*------------------------------------------------------ * 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; } /*-------------------------------------------------------------------------- * 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_data; HYPRE_Complex **recv_buffers_data; 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; /*-------------------------------------------------------------------- * 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_TAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); 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; } } /* Prepare send buffers: allocate device buffer */ HYPRE_Int alloc_dev_buffer = 0; /* In the case of running on device and cannot access host memory from device */ #if (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) #if defined(HYPRE_USING_RAJA) || defined(HYPRE_USING_KOKKOS) alloc_dev_buffer = 1; #elif defined(HYPRE_USING_CUDA) alloc_dev_buffer = (hypre_exec_policy == HYPRE_MEMORY_DEVICE); #elif defined(HYPRE_USING_DEVICE_OPENMP) alloc_dev_buffer = hypre__global_offload; #endif #endif if (alloc_dev_buffer) { send_buffers_data = hypre_TAlloc(HYPRE_Complex *, num_sends,HYPRE_MEMORY_HOST); if (num_sends > 0) { size = hypre_CommPkgSendBufsize(comm_pkg); if (size > global_send_size) { if (global_send_size > 0) { hypre_TFree(global_send_buffer,HYPRE_MEMORY_DEVICE); } global_send_buffer = hypre_CTAlloc(HYPRE_Complex, 5*size,HYPRE_MEMORY_DEVICE); global_send_size = 5*size; } send_buffers_data[0] = global_send_buffer; for (i = 1; i < num_sends; i++) { comm_type = hypre_CommPkgSendType(comm_pkg, i-1); size = hypre_CommTypeBufsize(comm_type); send_buffers_data[i] = send_buffers_data[i-1] + size; } } } else { send_buffers_data = send_buffers; } /* 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_TAlloc(HYPRE_Complex, size, HYPRE_MEMORY_HOST); 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; } } /* Prepare recv buffers */ if (alloc_dev_buffer) { recv_buffers_data = hypre_TAlloc(HYPRE_Complex *, num_recvs,HYPRE_MEMORY_HOST); if (num_recvs > 0) { size = hypre_CommPkgRecvBufsize(comm_pkg); if (size > global_recv_size) { if (global_recv_size > 0) { hypre_TFree(global_recv_buffer,HYPRE_MEMORY_DEVICE); } global_recv_buffer = hypre_CTAlloc(HYPRE_Complex, 5*size,HYPRE_MEMORY_DEVICE); global_recv_size = 5*size; } recv_buffers_data[0] = global_recv_buffer; for (i = 1; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i-1); size = hypre_CommTypeBufsize(comm_type); recv_buffers_data[i] = recv_buffers_data[i-1] + size; } } } else { recv_buffers_data = recv_buffers; } /*-------------------------------------------------------------------- * 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_data[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), HYPRE_MEMORY_DEVICE); dptr += size; } } } } /* Copy buffer data from Device to Host */ if (num_sends > 0 && alloc_dev_buffer) { HYPRE_Complex *dptr_host; size = hypre_CommPkgSendBufsize(comm_pkg); dptr_host = (HYPRE_Complex *) send_buffers[0]; dptr = (HYPRE_Complex *) send_buffers_data[0]; hypre_TMemcpy(dptr_host,dptr,HYPRE_Complex,size,HYPRE_MEMORY_HOST,HYPRE_MEMORY_DEVICE); } 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) ) { qptr = (HYPRE_Int *) send_buffers[i]; *qptr = num_entries; qptr ++; hypre_TMemcpy(qptr, hypre_CommTypeRemBoxnums(comm_type), HYPRE_Int, num_entries, HYPRE_MEMORY_HOST, HYPRE_MEMORY_HOST); qptr += num_entries; hypre_TMemcpy(qptr, hypre_CommTypeRemBoxes(comm_type), hypre_Box, num_entries, HYPRE_MEMORY_HOST, 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[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[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_CommHandleSendBuffersDevice(comm_handle) = send_buffers_data; hypre_CommHandleRecvBuffersDevice(comm_handle) = recv_buffers_data; *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_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_Complex **send_buffers_data = hypre_CommHandleSendBuffersDevice(comm_handle); HYPRE_Complex **recv_buffers_data = hypre_CommHandleRecvBuffersDevice(comm_handle); /*-------------------------------------------------------------------- * 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[i]; hypre_CommTypeNumEntries(comm_type) = *qptr; 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); hypre_CommTypeEntries(comm_type) = ct_entries; ct_entries += hypre_CommTypeNumEntries(comm_type); qptr = (HYPRE_Int *) recv_buffers[i]; num_entries = *qptr; qptr ++; boxnums = qptr; qptr += num_entries; boxes = (hypre_Box *) qptr; 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)); } } /*-------------------------------------------------------------------- * unpack receive buffer data *--------------------------------------------------------------------*/ /* Copy buffer data from Host to Device */ HYPRE_Int alloc_dev_buffer = 0; /* In the case of running on device and cannot access host memory from device */ #if (defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP)) && (HYPRE_MEMORY_HOST_ACT != HYPRE_MEMORY_SHARED) #if defined(HYPRE_USING_RAJA) || defined(HYPRE_USING_KOKKOS) alloc_dev_buffer = 1; #elif defined(HYPRE_USING_CUDA) alloc_dev_buffer = (hypre_exec_policy == HYPRE_MEMORY_DEVICE); #elif defined(HYPRE_USING_DEVICE_OPENMP) alloc_dev_buffer = hypre__global_offload; #endif #endif if (num_recvs > 0 && alloc_dev_buffer) { HYPRE_Complex *dptr_host; HYPRE_Int size; size = 0; for (i = 0; i < num_recvs; i++) { comm_type = hypre_CommPkgRecvType(comm_pkg, i); num_entries = hypre_CommTypeNumEntries(comm_type); size += hypre_CommTypeBufsize(comm_type); if ( hypre_CommPkgFirstComm(comm_pkg) ) { size += hypre_CommPrefixSize(num_entries); } } dptr_host = (HYPRE_Complex *) recv_buffers[0]; dptr = (HYPRE_Complex *) recv_buffers_data[0]; hypre_TMemcpy( dptr, dptr_host, HYPRE_Complex, size, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST ); } 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_data[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_TFree(send_buffers[0], HYPRE_MEMORY_HOST); } if (num_recvs > 0) { hypre_TFree(recv_buffers[0], HYPRE_MEMORY_HOST); } hypre_TFree(comm_handle, HYPRE_MEMORY_HOST); if (send_buffers == send_buffers_data) { hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); } else { hypre_TFree(send_buffers, HYPRE_MEMORY_HOST); hypre_TFree(send_buffers_data, HYPRE_MEMORY_HOST); } if (recv_buffers == recv_buffers_data) { hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); } else { hypre_TFree(recv_buffers, HYPRE_MEMORY_HOST); hypre_TFree(recv_buffers_data, 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.18.2/src/struct_mv/struct_communication.h000066400000000000000000000257671355566575400222400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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, the following are not needed (may be NULL) * send_rboxnums, send_rboxes, send_transforms * * For "forward" communication, the following are not needed (may be NULL) * recv_rboxnums, recv_rboxes, recv_transforms * *--------------------------------------------------------------------------*/ 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; HYPRE_Int first_comm; /* is this the first communication? */ HYPRE_Int ndim; HYPRE_Int num_values; hypre_Index send_stride; hypre_Index recv_stride; HYPRE_Int send_bufsize; /* total send buffer size (in doubles) */ HYPRE_Int recv_bufsize; /* total recv buffer size (in doubles) */ 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; HYPRE_Int **orders; /* num_orders x num_values */ HYPRE_Int *recv_data_offsets; /* offsets into recv data (by box) */ hypre_BoxArray *recv_data_space; /* recv data dimensions (by box) */ 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_data; HYPRE_Complex **recv_buffers_data; /* 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_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_CommHandleSendBuffersDevice(comm_handle) (comm_handle -> send_buffers_data) #define hypre_CommHandleRecvBuffersDevice(comm_handle) (comm_handle -> recv_buffers_data) #endif hypre-2.18.2/src/struct_mv/struct_copy.c000066400000000000000000000074221355566575400203240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- * 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.18.2/src/struct_mv/struct_grid.c000066400000000000000000000647251355566575400203100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; } #if defined(HYPRE_USING_CUDA) hypre_StructGridDataLocation(grid) = HYPRE_MEMORY_DEVICE; #endif *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]; hypre_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, boxnum; /*----------------------------------------------------- *-----------------------------------------------------*/ 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; } #if defined(HYPRE_USING_CUDA) HYPRE_Int hypre_StructGridGetMaxBoxSize(hypre_StructGrid *grid) { hypre_Box *box; hypre_BoxArray *boxes; HYPRE_Int box_size; HYPRE_Int i; HYPRE_Int max_box_size = 0; boxes = hypre_StructGridBoxes(grid); hypre_ForBoxI(i, boxes) { box = hypre_BoxArrayBox(hypre_StructGridBoxes(grid), i); box_size = hypre_BoxVolume(box); if (box_size > max_box_size) { max_box_size = box_size; } } return max_box_size; } HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid, HYPRE_Int data_location ) { hypre_StructGridDataLocation(grid) = data_location; return hypre_error_flag; } #endif hypre-2.18.2/src/struct_mv/struct_grid.h000066400000000000000000000075051355566575400203060ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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; #if defined(HYPRE_USING_CUDA) HYPRE_Int data_location; #endif } 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 defined(HYPRE_USING_CUDA) #define hypre_StructGridDataLocation(grid) ((grid) -> data_location) #endif /*-------------------------------------------------------------------------- * Looping macros: *--------------------------------------------------------------------------*/ #define hypre_ForStructGridBoxI(i, grid) \ hypre_ForBoxI(i, hypre_StructGridBoxes(grid)) #endif hypre-2.18.2/src/struct_mv/struct_innerprod.c000066400000000000000000000062601355566575400213510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- * 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 defined(HYPRE_USING_CUDA) //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) HYPRE_Real box_sum = 0.0; #elif defined(HYPRE_USING_RAJA) ReduceSum box_sum(0.0); #elif defined(HYPRE_USING_CUDA) 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.18.2/src/struct_mv/struct_io.c000066400000000000000000000300371355566575400177570ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 *--------------------------------------------------------------------------*/ 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; HYPRE_Complex *data_host; /*---------------------------------------- * Print data *----------------------------------------*/ #if HYPRE_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE HYPRE_Complex *data_host_saved; HYPRE_Int tot_size = 0; hypre_ForBoxI(i, data_space) { data_box = hypre_BoxArrayBox(data_space, i); data_box_volume = hypre_BoxVolume(data_box); tot_size += num_values * data_box_volume; } data_host = hypre_CTAlloc(HYPRE_Complex, tot_size, HYPRE_MEMORY_HOST); hypre_TMemcpy(data_host, data, HYPRE_Complex, tot_size, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); data_host_saved = data_host; #else data_host = data; #endif 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" */ hypre_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_host[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_host += num_values*data_box_volume; } #if HYPRE_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE hypre_TFree(data_host_saved, HYPRE_MEMORY_HOST); #endif return hypre_error_flag; } /*-------------------------------------------------------------------------- * hypre_PrintCCVDBoxArrayData * Note that the the stencil loop (j) is _outside_ the space index loop (datai), * unlie hypre_PrintBoxArrayData (there is no j loop in hypre_PrintCCBoxArrayData) *--------------------------------------------------------------------------*/ 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_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= 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]; } 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_MEMORY_DEVICE); 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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_MEMORY_DEVICE); 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; /*----------------------------------------------------------------------- * 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 *-----------------------------------------------------------------------*/ for (i = istart; i < istop; i++) { grid_box = hypre_BoxArrayBox(grid_boxes, i); if (hypre_IndexInBox(grid_index, grid_box)) { 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) { 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); } /* FIXME: THIS IS SLOW! copy one entry at a time from/to device */ #if HYPRE_MEMORY_DEVICE_ACT == HYPRE_MEMORY_DEVICE if (action > 0) { HYPRE_Complex matval; hypre_TMemcpy(&matval, matp, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); matval += values[s]; hypre_TMemcpy(matp, &matval, HYPRE_Complex, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); //*matp += values[s]; } else if (action > -1) { hypre_TMemcpy(matp, &(values[s]), HYPRE_Complex, 1, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); //*matp = values[s]; } else /* action < 0 */ { //values[s] = *matp; hypre_TMemcpy(&(values[s]), matp, HYPRE_Complex, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); } #else /* TODO: combine to code above ? */ if (action > 0) { *matp += values[s]; } else if (action > -1) { *matp = values[s]; } else /* action < 0 */ { values[s] = *matp; } #endif } } } } 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; 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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 defined(HYPRE_USING_CUDA) 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=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_StructMatrixPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructMatrixPrint( const char *filename, hypre_StructMatrix *matrix, HYPRE_Int all ) { FILE *file; char new_filename[255]; hypre_StructGrid *grid; hypre_BoxArray *boxes; hypre_StructStencil *stencil; hypre_Index *stencil_shape; HYPRE_Int stencil_size; hypre_Index center_index; HYPRE_Int ndim, num_values; hypre_BoxArray *data_space; HYPRE_Int *symm_elements; HYPRE_Int i, j, d; HYPRE_Int constant_coefficient; HYPRE_Int center_rank; HYPRE_Int myid; constant_coefficient = hypre_StructMatrixConstantCoefficient(matrix); /*---------------------------------------- * 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 /*-------------------------------------------------------------------------- * 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_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_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.18.2/src/struct_mv/struct_matrix_mask.c000066400000000000000000000125551355566575400216740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/struct_mv/struct_matvec.c000066400000000000000000001561161355566575400206360ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /* 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( ) { 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; /*---------------------------------------------------------- * 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; 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 *-----------------------------------------------------------------------*/ 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; } 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.18.2/src/struct_mv/struct_scale.c000066400000000000000000000034221355566575400204350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- * 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.18.2/src/struct_mv/struct_stencil.c000066400000000000000000000147461355566575400210220ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/struct_stencil.h000066400000000000000000000032701355566575400210150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/struct_mv/struct_vector.c000066400000000000000000001111341355566575400206500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ 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]; } 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)) { #if defined(HYPRE_USING_CUDA) hypre_StructGrid *grid = hypre_StructVectorGrid(vector); if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { hypre_TFree(hypre_StructVectorData(vector),HYPRE_MEMORY_DEVICE); } else { hypre_TFree(hypre_StructVectorData(vector),HYPRE_MEMORY_HOST); } #else hypre_TFree(hypre_StructVectorData(vector),HYPRE_MEMORY_DEVICE); #endif } 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); #if defined(HYPRE_USING_CUDA) hypre_StructGrid *grid = hypre_StructVectorGrid(vector); if (hypre_StructGridDataLocation(grid) != HYPRE_MEMORY_HOST) { data = hypre_CTAlloc(HYPRE_Complex, hypre_StructVectorDataSize(vector),HYPRE_MEMORY_DEVICE); } else { data = hypre_CTAlloc(HYPRE_Complex, hypre_StructVectorDataSize(vector),HYPRE_MEMORY_HOST); } #else data = hypre_CTAlloc(HYPRE_Complex, hypre_StructVectorDataSize(vector),HYPRE_MEMORY_DEVICE); #endif 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 (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 (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 (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); *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) { #if defined(HYPRE_USING_CUDA) 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 ) { 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_StructVectorPrint *--------------------------------------------------------------------------*/ HYPRE_Int hypre_StructVectorPrint( const char *filename, hypre_StructVector *vector, HYPRE_Int all ) { FILE *file; char new_filename[255]; hypre_StructGrid *grid; hypre_BoxArray *boxes; hypre_BoxArray *data_space; 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); exit(1); } /*---------------------------------------- * 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 *----------------------------------------*/ data_space = hypre_StructVectorDataSpace(vector); if (all) boxes = data_space; else boxes = hypre_StructGridBoxes(grid); hypre_fprintf(file, "\nData:\n"); hypre_PrintBoxArrayData(file, boxes, data_space, 1, hypre_StructGridNDim(grid), hypre_StructVectorData(vector)); /*---------------------------------------- * Close file *----------------------------------------*/ fflush(file); fclose(file); return hypre_error_flag; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ 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_BoxArray *boxes; hypre_BoxArray *data_space; 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, "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 *----------------------------------------*/ boxes = hypre_StructGridBoxes(grid); data_space = hypre_StructVectorDataSpace(vector); hypre_fscanf(file, "\nData:\n"); hypre_ReadBoxArrayData(file, boxes, data_space, 1, hypre_StructGridNDim(grid), hypre_StructVectorData(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_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_Int i; hypre_StructVector *y = hypre_StructVectorCreate(comm, grid); hypre_StructVectorDataSize(y) = data_size; hypre_StructVectorDataSpace(y) = hypre_BoxArrayDuplicate(data_space); hypre_StructVectorData(y) = hypre_CTAlloc(HYPRE_Complex, data_size, HYPRE_MEMORY_DEVICE); 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.18.2/src/struct_mv/struct_vector.h000066400000000000000000000064641355566575400206660ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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.18.2/src/tarch000077500000000000000000000036321355566575400146020ustar00rootroot00000000000000#! /bin/sh # 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.18.2/src/test/000077500000000000000000000000001355566575400145265ustar00rootroot00000000000000hypre-2.18.2/src/test/CMakeLists.txt000066400000000000000000000007141355566575400172700ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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(TEST_SRCS ij.c sstruct.c struct.c ams_driver.c maxwell_unscaled.c struct_migrate.c sstruct_fac.c ij_mv.c ) add_hypre_executables(TEST_SRCS) hypre-2.18.2/src/test/Makefile000066400000000000000000000151221355566575400161670ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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$(srcdir)/..\ -I${HYPRE_BUILD_DIR}/include\ $(SUPERLU_INCLUDE)\ $(DSUPERLU_INCLUDE)\ ${CINCLUDES}\ ${CDEFS} CXX_COMPILE_FLAGS = \ -I$(srcdir)\ -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$(srcdir)/..\ -I${HYPRE_BUILD_DIR}/include\ ${CINCLUDES} MPILIBFLAGS = ${MPILIBDIRS} ${MPILIBS} ${MPIFLAGS} LAPACKLIBFLAGS = ${LAPACKLIBDIRS} ${LAPACKLIBS} BLASLIBFLAGS = ${BLASLIBDIRS} ${BLASLIBS} LIBFLAGS = ${LDFLAGS} ${LIBS} ifeq (${LINK_CC}, nvcc) XLINK = -Xlinker=-rpath,${HYPRE_BUILD_DIR}/lib else XLINK = -Wl,-rpath,${HYPRE_BUILD_DIR}/lib endif LFLAGS =\ -L${HYPRE_BUILD_DIR}/lib -lHYPRE\ ${XLINK}\ ${DSUPERLU_LIBS}\ ${SUPERLU_LIBS}\ ${MPILIBFLAGS}\ ${LAPACKLIBFLAGS}\ ${BLASLIBFLAGS}\ ${LIBFLAGS} ################################################################## # Targets ################################################################## HYPRE_DRIVERS =\ ij.c\ sstruct.c\ struct.c\ ams_driver.c\ maxwell_unscaled.c\ struct_migrate.c\ sstruct_fac.c\ ij_mv.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_ij_mv.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 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 $@ $@.o ${LFLAGS} sstruct: sstruct.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} struct: struct.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} ams_driver: ams_driver.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} maxwell_unscaled: maxwell_unscaled.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} struct_migrate: struct_migrate.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} sstruct_fac: sstruct_fac.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} ij_mv: ij_mv.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} ij_device: ij_device.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} ij_mm: ij_mm.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} zboxloop: zboxloop.o @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.o ${LFLAGS} struct_newboxloop: struct_newboxloop.o $(KOKKOS_LINK_DEPENDS) @echo "Building" $@ "... " ${LINK_CC} -o $@ $@.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_ij_mv: f77_ij_mv.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.18.2/src/test/TEST_ams/000077500000000000000000000000001355566575400161455ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_ams/.psrc000066400000000000000000000002131355566575400171110ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_ams/mfem.A.00000000066400000000000000000015070551355566575400176460ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.A.00001000066400000000000000000016341101355566575400176400ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.A.00002000066400000000000000000020632521355566575400176450ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.A.00003000066400000000000000000016211611355566575400176440ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.Aalpha.00000000066400000000000000000001053251355566575400206450ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.Aalpha.00001000066400000000000000000001134451355566575400206500ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.Aalpha.00002000066400000000000000000001324131355566575400206450ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.Aalpha.00003000066400000000000000000000660041355566575400206500ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/mfem.Abeta.00000000066400000000000000000001054131355566575400204710ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.Abeta.00001000066400000000000000000001136471355566575400205020ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.Abeta.00002000066400000000000000000001324131355566575400204730ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.Abeta.00003000066400000000000000000000660041355566575400204760ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/mfem.G.00000000066400000000000000000002015241355566575400176430ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.G.00001000066400000000000000000002374611355566575400176550ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.G.00002000066400000000000000000002565611355566575400176600ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.G.00003000066400000000000000000002557711355566575400176630ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.Gx.00000000066400000000000000000000712641355566575400200410ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.Gx.00001000066400000000000000000001054271355566575400200410ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.Gx.00002000066400000000000000000001141001355566575400200260ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.Gx.00003000066400000000000000000001136041355566575400200370ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.Gy.00000000066400000000000000000000713531355566575400200410ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.Gy.00001000066400000000000000000001054431355566575400200400ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.Gy.00002000066400000000000000000001140441355566575400200360ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.Gy.00003000066400000000000000000001136011355566575400200350ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.Gz.00000000066400000000000000000000713501355566575400200370ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.Gz.00001000066400000000000000000001054261355566575400200420ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.Gz.00002000066400000000000000000001140741355566575400200420ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.Gz.00003000066400000000000000000001135611355566575400200430ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.M.00000000066400000000000000000015030611355566575400176530ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.M.00001000066400000000000000000016266071355566575400176700ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.M.00002000066400000000000000000020556321355566575400176640ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.M.00003000066400000000000000000016147451355566575400176720ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.b.00000000066400000000000000000000714031355566575400176770ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.b.00001000066400000000000000000001055221355566575400177000ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.b.00002000066400000000000000000001142731355566575400177040ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.b.00003000066400000000000000000001137431355566575400177060ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.inodes.00000000066400000000000000000000076421355566575400207430ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.inodes.00001000066400000000000000000000131771355566575400207440ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.inodes.00002000066400000000000000000000151131355566575400207350ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.inodes.00003000066400000000000000000000146511355566575400207440ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/mfem.x.00000000066400000000000000000000076421355566575400177310ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.x.00001000066400000000000000000000131771355566575400177320ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.x.00002000066400000000000000000000151131355566575400177230ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.x.00003000066400000000000000000000146511355566575400177320ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/mfem.x0.00000000066400000000000000000000705101355566575400200030ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.x0.00001000066400000000000000000001046061355566575400200100ustar00rootroot000000000000001076 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.18.2/src/test/TEST_ams/mfem.x0.00002000066400000000000000000001132461355566575400200110ustar00rootroot000000000000002333 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.18.2/src/test/TEST_ams/mfem.x0.00003000066400000000000000000001127761355566575400200210ustar00rootroot000000000000003710 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.18.2/src/test/TEST_ams/mfem.y.00000000066400000000000000000000076421355566575400177320ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.y.00001000066400000000000000000000131771355566575400177330ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.y.00002000066400000000000000000000151131355566575400177240ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.y.00003000066400000000000000000000146511355566575400177330ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/mfem.z.00000000066400000000000000000000076421355566575400177330ustar00rootroot000000000000001 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.18.2/src/test/TEST_ams/mfem.z.00001000066400000000000000000000131771355566575400177340ustar00rootroot00000000000000153 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.18.2/src/test/TEST_ams/mfem.z.00002000066400000000000000000000151131355566575400177250ustar00rootroot00000000000000366 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.18.2/src/test/TEST_ams/mfem.z.00003000066400000000000000000000146511355566575400177340ustar00rootroot00000000000000615 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.18.2/src/test/TEST_ams/solvers.jobs000077500000000000000000000023551355566575400205310ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -ctype 10 -tol 0 -zc -maxit 18 -rr 4 > solvers.out.12 hypre-2.18.2/src/test/TEST_ams/solvers.saved000066400000000000000000000063521355566575400206740ustar00rootroot00000000000000# Output file: solvers.out.0 Cycle 14 7.391011e-05 0.433319 5.504405e-06 Cycle 15 3.204481e-05 0.433565 2.386515e-06 Cycle 16 1.389710e-05 0.433677 1.034977e-06 Cycle 17 6.028819e-06 0.433818 4.489922e-07 Average Convergence Factor = 0.423255 # Output file: solvers.out.1 Cycle 14 7.391011e-05 0.433319 5.504405e-06 Cycle 15 3.204481e-05 0.433565 2.386515e-06 Cycle 16 1.389710e-05 0.433677 1.034977e-06 Cycle 17 6.028819e-06 0.433818 4.489922e-07 Average Convergence Factor = 0.423255 # Output file: solvers.out.2 Cycle 39 3.556869e-05 0.721136 2.648954e-06 Cycle 40 2.565030e-05 0.721148 1.910288e-06 Cycle 41 1.850064e-05 0.721264 1.377823e-06 Cycle 42 1.334647e-05 0.721406 9.939689e-07 Average Convergence Factor = 0.719582 # Output file: solvers.out.3 Cycle 39 3.556869e-05 0.721136 2.648954e-06 Cycle 40 2.565030e-05 0.721148 1.910288e-06 Cycle 41 1.850064e-05 0.721264 1.377823e-06 Cycle 42 1.334647e-05 0.721406 9.939689e-07 Average Convergence Factor = 0.719582 # Output file: solvers.out.4 Iterations = 6 Final Relative Residual Norm = 6.440133e-07 # Output file: solvers.out.5 Iterations = 6 Final Relative Residual Norm = 6.440133e-07 # Output file: solvers.out.6 Iterations = 9 Final Relative Residual Norm = 9.646786e-07 # Output file: solvers.out.7 Iterations = 9 Final Relative Residual Norm = 9.646786e-07 # Output file: solvers.out.12 Iterations = 18 Final Relative Residual Norm = 4.223622e-03 # Output file: solvers.out.8 Eigenvalue lambda 3.02357653918384e+01 Eigenvalue lambda 3.03135374700770e+01 Eigenvalue lambda 3.85013899426320e+01 Eigenvalue lambda 5.14395940110704e+01 Eigenvalue lambda 5.15742481830717e+01 Residual 5.87463691694547e-05 Residual 3.93631178482166e-05 Residual 4.65887563072628e-05 Residual 1.00557024939354e-04 Residual 9.03586581004640e-05 17 iterations # Output file: solvers.out.9 Eigenvalue lambda 3.02357653918384e+01 Eigenvalue lambda 3.03135374700770e+01 Eigenvalue lambda 3.85013899426320e+01 Eigenvalue lambda 5.14395940110704e+01 Eigenvalue lambda 5.15742481830717e+01 Residual 5.87463691694547e-05 Residual 3.93631178482166e-05 Residual 4.65887563072628e-05 Residual 1.00557024939354e-04 Residual 9.03586581004640e-05 17 iterations # Output file: solvers.out.10 Eigenvalue lambda 3.02357653921933e+01 Eigenvalue lambda 3.03135374704450e+01 Eigenvalue lambda 3.85013899428099e+01 Eigenvalue lambda 5.14395940120781e+01 Eigenvalue lambda 5.15742481835172e+01 Residual 1.12876127062766e-04 Residual 1.14382477254247e-04 Residual 8.18301203762700e-05 Residual 1.11751810983326e-04 Residual 9.84441562127637e-05 23 iterations # Output file: solvers.out.11 Eigenvalue lambda 3.02357653921933e+01 Eigenvalue lambda 3.03135374704450e+01 Eigenvalue lambda 3.85013899428099e+01 Eigenvalue lambda 5.14395940120781e+01 Eigenvalue lambda 5.15742481835172e+01 Residual 1.12876127062766e-04 Residual 1.14382477254247e-04 Residual 8.18301203762700e-05 Residual 1.11751810983326e-04 Residual 9.84441562127637e-05 23 iterations hypre-2.18.2/src/test/TEST_ams/solvers.sh000077500000000000000000000041121355566575400201770ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 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 # Make sure that the output files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_examples/000077500000000000000000000000001355566575400172035ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_examples/bigint.jobs000077500000000000000000000007301355566575400213410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/bigint.saved000066400000000000000000000112761355566575400215120ustar00rootroot00000000000000# Output file: bigint.out.1 Operator Matrix Information: nonzero entries/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 -4.233e-16 3.020e+00 3 57 773 0.238 4 21 13.6 7.589e-17 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 x cols min max avgW weight weight min max ================================================================================ 0 1089 x 545 1 4 3.9 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 2.8 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 3.1 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 2.4 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.2 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.801266e-10 0.060921 6.309890e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.309890e-09 # Output file: bigint.out.2 ============================================= SStruct phase times: ============================================= SStruct Setup: wall clock time = 0.210000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.210000 seconds cpu MFLOPS = 0.000000 Problem size: 26460 ============================================= Setup phase times: ============================================= AMS Setup: wall clock time = 0.090000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.100000 seconds cpu MFLOPS = 0.000000 : 8.373120e-02 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.820328e-02 0.097467 9.746663e-02 2 1.245772e-03 0.044171 4.305215e-03 3 9.147965e-05 0.073432 3.161410e-04 4 2.203937e-05 0.240921 7.616500e-05 5 4.101633e-06 0.186105 1.417468e-05 6 7.804698e-07 0.190283 2.697195e-06 7 1.393405e-07 0.178534 4.815415e-07 ============================================= Solve phase times: ============================================= AMS Solve: wall clock time = 0.160000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.160000 seconds cpu MFLOPS = 0.000000 Iterations = 7 Final Relative Residual Norm = 4.81542e-07 hypre-2.18.2/src/test/TEST_examples/bigint.sh000077500000000000000000000017441355566575400210240ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -93 $i done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 fi hypre-2.18.2/src/test/TEST_examples/complex.jobs000077500000000000000000000006651355566575400215430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/complex.sh000077500000000000000000000010551355566575400212120ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/default.jobs000077500000000000000000000021701355566575400215110ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/default.saved000066400000000000000000000461001355566575400216540ustar00rootroot00000000000000# Output file: default.out.1 : 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 # Output file: default.out.2 : 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 # Output file: default.out.3 : 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 # Output file: default.out.4 ============================================= Setup phase times: ============================================= PCG Setup: wall clock time = 32.000000 seconds wall MFLOPS = 0.000000 cpu clock time = 25.090000 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 = 8.160000 seconds wall MFLOPS = 0.000000 cpu clock time = 6.650000 seconds cpu MFLOPS = 0.000000 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: default.out.5 Operator Matrix Information: nonzero entries/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 -4.233e-16 3.020e+00 3 57 773 0.238 4 21 13.6 7.589e-17 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 x cols min max avgW weight weight min max ================================================================================ 0 1089 x 545 1 4 3.9 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 2.8 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 3.1 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 2.4 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.2 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.801266e-10 0.060921 6.309890e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.309890e-09 # Output file: default.out.5f Operator Matrix Information: nonzero entries/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 -4.233e-16 3.020e+00 3 57 773 0.238 4 21 13.6 7.589e-17 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 x cols min max avgW weight weight min max ================================================================================ 0 1089 x 545 1 4 3.9 2.500e-01 2.500e-01 7.500e-01 1.000e+00 1 545 x 157 1 4 2.8 7.143e-02 5.000e-01 2.857e-01 1.000e+00 2 157 x 57 1 6 3.1 2.767e-02 5.489e-01 2.630e-01 1.000e+00 3 57 x 19 0 5 2.4 1.892e-02 7.312e-01 0.000e+00 1.000e+00 4 19 x 6 0 4 2.2 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.801266e-10 0.060921 6.309890e-09 Average Convergence Factor = 0.067387 Complexity: grid = 1.719927 operator = 2.361942 cycle = 4.717109 Iterations = 7 Final Relative Residual Norm = 6.30989028E-09 # Output file: default.out.6 : 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 # Output file: default.out.7 ============================================= Setup phase times: ============================================= PCG Setup: wall clock time = 32.380000 seconds wall MFLOPS = 0.000000 cpu clock time = 25.270000 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 = 7.260000 seconds wall MFLOPS = 0.000000 cpu clock time = 5.790000 seconds cpu MFLOPS = 0.000000 Iterations = 6 Final Relative Residual Norm = 5.961443e-08 # Output file: default.out.8 : 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 # Output file: default.out.9 L2 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 # Output file: default.out.11 2 132 x 29 0 4 3.5 5.687e-03 5.328e-01 0.000e+00 1.000e+00 3 29 x 4 1 4 2.7 6.881e-03 4.675e-01 7.079e-02 1.000e+00 Complexity: grid = 1.651974 operator = 2.383776 memory = 3.295125 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: 2 2 1 Type 0=Jac, 3=hGS, 6=hSGS, 9=GE: 13 14 9 Point types, partial sweeps (1=C, -1=F): Pre-CG relaxation (down): 0 0 Post-CG relaxation (up): 0 0 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.81010023232597e-01 Iteration 2 bsize 10 maxres 2.16106638420483e-01 Iteration 3 bsize 10 maxres 1.33255378957699e-01 Iteration 4 bsize 10 maxres 6.63135103881281e-02 Iteration 5 bsize 10 maxres 5.98898745939707e-02 Iteration 6 bsize 10 maxres 3.24851727613947e-02 Iteration 7 bsize 10 maxres 1.24818484659858e-02 Iteration 8 bsize 9 maxres 3.28135782117784e-03 Iteration 9 bsize 9 maxres 1.37465135021034e-03 Iteration 10 bsize 7 maxres 5.53538771528421e-04 Iteration 11 bsize 6 maxres 2.39420582335701e-04 Iteration 12 bsize 4 maxres 1.65909557562297e-04 Iteration 13 bsize 4 maxres 9.99715384081695e-05 Iteration 14 bsize 3 maxres 5.93603896817596e-05 Iteration 15 bsize 2 maxres 2.88451774920854e-05 Iteration 16 bsize 2 maxres 1.03761599946811e-05 Iteration 17 bsize 2 maxres 5.80576550088874e-06 Iteration 18 bsize 2 maxres 4.76778988364290e-06 Iteration 19 bsize 2 maxres 4.89371670567952e-06 Iteration 20 bsize 2 maxres 3.10957559901931e-06 Iteration 21 bsize 2 maxres 1.85952798560890e-06 Iteration 22 bsize 2 maxres 9.96634709813028e-07 Iteration 23 bsize 2 maxres 6.38856516889256e-07 Iteration 24 bsize 2 maxres 3.57575647705605e-07 Iteration 25 bsize 1 maxres 2.50720421537878e-07 Iteration 26 bsize 1 maxres 1.33984380971654e-07 Eigenvalue lambda 1.70632948198619e-02 Eigenvalue lambda 4.25854480421056e-02 Eigenvalue lambda 4.25854480421299e-02 Eigenvalue lambda 6.81076012644266e-02 Eigenvalue lambda 8.48803610641320e-02 Eigenvalue lambda 8.48803610649201e-02 Eigenvalue lambda 1.10402514286512e-01 Eigenvalue lambda 1.10402514291700e-01 Eigenvalue lambda 1.43587188598359e-01 Eigenvalue lambda 1.43587188847947e-01 Residual 2.59873942049052e-08 Residual 1.18843349666549e-08 Residual 1.23872744529267e-08 Residual 5.10375475086747e-08 Residual 5.10377811863076e-08 Residual 3.70656076366488e-08 Residual 3.63780666486010e-08 Residual 1.18640460683670e-07 Residual 1.21370637119926e-07 Residual 1.33984380971654e-07 26 iterations ============================================= Solve phase times: ============================================= LOBPCG Solve: wall clock time = 0.090000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.090000 seconds cpu MFLOPS = 0.000000 # Output file: default.out.12 : 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 # Output file: default.out.12f : 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 # Output file: default.out.13 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.334657e-01 1.000000e+00 Cycle 1 3.447912e-02 0.147684 1.476839e-01 Cycle 2 5.073235e-03 0.147139 2.173011e-02 Cycle 3 7.530408e-04 0.148434 3.225487e-03 Cycle 4 1.131421e-04 0.150247 4.846199e-04 Cycle 5 1.713572e-05 0.151453 7.339717e-05 Cycle 6 2.620347e-06 0.152917 1.122369e-05 Cycle 7 4.055800e-07 0.154781 1.737214e-06 Cycle 8 6.362639e-08 0.156878 2.725299e-07 Average Convergence Factor = 0.151156 Complexity: grid = 1.509834 operator = 1.841964 cycle = 3.675148 Iterations = 8 Final Relative Residual Norm = 2.7253e-07 # Output file: default.out.14 AMG SOLUTION INFO: relative residual factor residual -------- ------ -------- Initial 2.334657e-01 1.000000e+00 Cycle 1 3.447912e-02 0.147684 1.476839e-01 Cycle 2 5.073235e-03 0.147139 2.173011e-02 Cycle 3 7.530408e-04 0.148434 3.225487e-03 Cycle 4 1.131421e-04 0.150247 4.846199e-04 Cycle 5 1.713572e-05 0.151453 7.339717e-05 Cycle 6 2.620347e-06 0.152917 1.122369e-05 Cycle 7 4.055800e-07 0.154781 1.737214e-06 Cycle 8 6.362639e-08 0.156878 2.725299e-07 Average Convergence Factor = 0.151156 Complexity: grid = 1.509834 operator = 1.841964 cycle = 3.675148 Iterations = 8 Final Relative Residual Norm = 2.7253e-07 # Output file: default.out.15 ============================================= SStruct phase times: ============================================= SStruct Setup: wall clock time = 0.220000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.220000 seconds cpu MFLOPS = 0.000000 Problem size: 26460 ============================================= Setup phase times: ============================================= AMS Setup: wall clock time = 0.090000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.100000 seconds cpu MFLOPS = 0.000000 : 8.373120e-02 Iters ||r||_C conv.rate ||r||_C/||b||_C ----- ------------ --------- ------------ 1 2.820328e-02 0.097467 9.746663e-02 2 1.245772e-03 0.044171 4.305215e-03 3 9.147965e-05 0.073432 3.161410e-04 4 2.203937e-05 0.240921 7.616500e-05 5 4.101633e-06 0.186105 1.417468e-05 6 7.804698e-07 0.190283 2.697195e-06 7 1.393405e-07 0.178534 4.815415e-07 ============================================= Solve phase times: ============================================= AMS Solve: wall clock time = 0.150000 seconds wall MFLOPS = 0.000000 cpu clock time = 0.150000 seconds cpu MFLOPS = 0.000000 Iterations = 7 Final Relative Residual Norm = 4.81542e-07 hypre-2.18.2/src/test/TEST_examples/default.sh000077500000000000000000000023311355566575400211650ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.11\ ${TNAME}.out.12\ ${TNAME}.out.12f\ ${TNAME}.out.13\ ${TNAME}.out.14\ ${TNAME}.out.15\ " # Need to avoid output lines about "no global partition" for i in $FILES do echo "# Output file: $i" tail -93 $i done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 fi hypre-2.18.2/src/test/TEST_examples/ex1.base000066400000000000000000000014111355566575400205310ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex10.base000066400000000000000000000030301355566575400206100ustar00rootroot00000000000000*************************************************** * 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.18.2/src/test/TEST_examples/ex11.base000066400000000000000000000113521355566575400206170ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex12.base000066400000000000000000000005071355566575400206200ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex12f.base000066400000000000000000000005071355566575400207660ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex13.base000066400000000000000000000013441355566575400206210ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex14.base000066400000000000000000000013441355566575400206220ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex15.base000066400000000000000000000024611355566575400206240ustar00rootroot00000000000000============================================= 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.18.2/src/test/TEST_examples/ex15big.base000066400000000000000000000024611355566575400213060ustar00rootroot00000000000000============================================= 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.18.2/src/test/TEST_examples/ex17.base000066400000000000000000000024671355566575400206340ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex18.base000066400000000000000000000016471355566575400206340ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex18comp.base000066400000000000000000000017311355566575400215050ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex2.base000066400000000000000000000004251355566575400205360ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex3.base000066400000000000000000000006621355566575400205420ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex4.base000066400000000000000000000017431355566575400205440ustar00rootroot00000000000000============================================= 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.18.2/src/test/TEST_examples/ex5.base000066400000000000000000000071131355566575400205420ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex5b.base000066400000000000000000000071211355566575400207030ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex5b77.base000066400000000000000000000071301355566575400210610ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex5big.base000066400000000000000000000071131355566575400212240ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex5f.base000066400000000000000000000071221355566575400207100ustar00rootroot00000000000000 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.18.2/src/test/TEST_examples/ex6.base000066400000000000000000000004251355566575400205420ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex7.base000066400000000000000000000017431355566575400205470ustar00rootroot00000000000000============================================= 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.18.2/src/test/TEST_examples/ex8.base000066400000000000000000000011011355566575400205340ustar00rootroot00000000000000: 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.18.2/src/test/TEST_examples/ex9.base000066400000000000000000000013701355566575400205450ustar00rootroot00000000000000L2 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.18.2/src/test/TEST_examples/fortran_examples.jobs000077500000000000000000000012741355566575400234420ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/fortran_examples.sh000077500000000000000000000035411355566575400231160ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/maxdim.jobs000077500000000000000000000007311355566575400213450ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_examples/maxdim.sh000077500000000000000000000011261355566575400210210ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/000077500000000000000000000000001355566575400161165ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_fac/.psrc000066400000000000000000000002131355566575400170620ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_fac/3lev.in000066400000000000000000000600461355566575400173250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/3lev_multibox.in000066400000000000000000001361141355566575400212500ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/4lev.in000066400000000000000000001103621355566575400173230ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/5lev.in000066400000000000000000001403151355566575400173250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/6lev.in000066400000000000000000001673011355566575400173320ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/7lev.in000066400000000000000000002205601355566575400173300ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fac/sstruct_fac.jobs000077500000000000000000000030241355566575400213170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 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.18.2/src/test/TEST_fac/sstruct_fac.saved000066400000000000000000000013621355566575400214640ustar00rootroot00000000000000# 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.4 Iterations = 16 Final Relative Residual Norm = 4.466155e-07 # Output file: sstruct_fac.out.5 Iterations = 16 Final Relative Residual Norm = 4.466155e-07 # Output file: sstruct_fac.out.6 Iterations = 16 Final Relative Residual Norm = 6.294807e-07 # Output file: sstruct_fac.out.7 Iterations = 16 Final Relative Residual Norm = 6.294807e-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.18.2/src/test/TEST_fac/sstruct_fac.sh000077500000000000000000000053521355566575400210020ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.4\ ${TNAME}.out.5\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.10\ ${TNAME}.out.11\ " # ${TNAME}.out.2\ # ${TNAME}.out.3\ # ${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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_fei/000077500000000000000000000000001355566575400161305ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_fei/.psrc000066400000000000000000000002131355566575400170740ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_fei/BC.0000066400000000000000000000107041355566575400164770ustar00rootroot0000000000000064 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.18.2/src/test/TEST_fei/BC.1000066400000000000000000000063061355566575400165030ustar00rootroot0000000000000046 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.18.2/src/test/TEST_fei/BC.2000066400000000000000000000076141355566575400165070ustar00rootroot0000000000000056 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.18.2/src/test/TEST_fei/BC.3000066400000000000000000000031451355566575400165030ustar00rootroot0000000000000023 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.18.2/src/test/TEST_fei/RHS.0000066400000000000000000001255101355566575400166510ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 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.18.2/src/test/TEST_fei/RHS.1000066400000000000000000001266511355566575400166610ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 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.18.2/src/test/TEST_fei/RHS.2000066400000000000000000001300121355566575400166440ustar00rootroot00000000000000 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 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.18.2/src/test/TEST_fei/RHS.3000066400000000000000000001220451355566575400166540ustar00rootroot00000000000000 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.18.2/src/test/TEST_fei/SFEI.0000066400000000000000000040427571355566575400167620ustar00rootroot0000000000000072 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.18.2/src/test/TEST_fei/SFEI.1000066400000000000000000040777121355566575400167620ustar00rootroot0000000000000073 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.18.2/src/test/TEST_fei/SFEI.2000066400000000000000000041346471355566575400167640ustar00rootroot0000000000000074 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.18.2/src/test/TEST_fei/SFEI.3000066400000000000000000037141351355566575400167600ustar00rootroot0000000000000069 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.18.2/src/test/TEST_fei/solvers.jobs000077500000000000000000000013631355566575400205120ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_fei/solvers.saved000066400000000000000000000064501355566575400206560ustar00rootroot00000000000000Running 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.18.2/src/test/TEST_fei/solvers.sh000077500000000000000000000005721355566575400201700ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_ij/000077500000000000000000000000001355566575400157675ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_ij/.psrc000066400000000000000000000002131355566575400167330ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_ij/A.00000000066400000000000000000007466331355566575400165530ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/A.00001000066400000000000000000007031031355566575400165350ustar00rootroot00000000000000504 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.18.2/src/test/TEST_ij/A_tstoffd.00000000066400000000000000000000002401355566575400202550ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/A_tstoffd.00001000066400000000000000000000002061355566575400202600ustar00rootroot0000000000000012 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.18.2/src/test/TEST_ij/A_tstoffd.00002000066400000000000000000000003461355566575400202660ustar00rootroot0000000000000017 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.18.2/src/test/TEST_ij/A_tstoffd.00003000066400000000000000000000005001355566575400202570ustar00rootroot0000000000000027 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.18.2/src/test/TEST_ij/agg_interp.jobs000077500000000000000000000056001355566575400207710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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) # 8: multipass interpolation all levels for systems problem unknown approach # 8: 2s-ei interpolation all levels for systems problem unknown approach # 8: multipass interpolation all levels for systems problem hybrid approach # 8: 2s-ei interpolation all levels for systems problem hybrid approach #============================================================================= 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 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 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 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 1 -agg_Pmx 4 -agg_P12_mx 4 -nodal 1 -solver 1 -rlx 6 \ >> agg_interp.out.13 hypre-2.18.2/src/test/TEST_ij/agg_interp.saved000066400000000000000000000023251355566575400211340ustar00rootroot00000000000000# 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.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.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.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.13 Iterations = 16 Final Relative Residual Norm = 5.087936e-09 hypre-2.18.2/src/test/TEST_ij/agg_interp.sh000077500000000000000000000026141355566575400204500ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/b_tstoffd.00000000066400000000000000000000001621355566575400203210ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/b_tstoffd.00001000066400000000000000000000001351355566575400203220ustar00rootroot0000000000000012 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.18.2/src/test/TEST_ij/b_tstoffd.00002000066400000000000000000000002371355566575400203260ustar00rootroot0000000000000017 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.18.2/src/test/TEST_ij/b_tstoffd.00003000066400000000000000000000003361355566575400203270ustar00rootroot0000000000000027 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.18.2/src/test/TEST_ij/coarsening.jobs000077500000000000000000000041351355566575400210040ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 hypre-2.18.2/src/test/TEST_ij/coarsening.saved000066400000000000000000000035461355566575400211530ustar00rootroot00000000000000# 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.238460e-09 # Output file: coarsening.out.12 BoomerAMG Iterations = 13 Final Relative Residual Norm = 2.784139e-09 # Output file: coarsening.out.13 BoomerAMG Iterations = 14 Final Relative Residual Norm = 3.301634e-09 hypre-2.18.2/src/test/TEST_ij/coarsening.sh000077500000000000000000000030331355566575400204550ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 FILES="\ ${TNAME}.out.6\ ${TNAME}.out.7\ ${TNAME}.out.8\ ${TNAME}.out.9\ ${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 files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* ${TNAME}.testdata.tmp0 hypre-2.18.2/src/test/TEST_ij/default.jobs000077500000000000000000000012061355566575400202740ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -pmis -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.18.2/src/test/TEST_ij/default.saved000066400000000000000000000010261355566575400204360ustar00rootroot00000000000000# 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.18.2/src/test/TEST_ij/default.sh000077500000000000000000000036561355566575400177640ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/elast.jobs000077500000000000000000000044441355566575400177670ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 > elast.out.0 mpirun -np 2 ./ij -fromfile A -nf 2 -rlx 6 -solver 1 -nodal 4 -falgout -interptype 0 -Pmx 0 > 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 > 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 -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 -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 > 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 > 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 hypre-2.18.2/src/test/TEST_ij/elast.saved000066400000000000000000000075261355566575400201350ustar00rootroot00000000000000# Output file: elast.out.0 10 1.020793e-03 0.147854 3.284349e-05 11 1.829583e-04 0.179231 5.886586e-06 12 2.804552e-05 0.153289 9.023500e-07 13 4.893103e-06 0.174470 1.574330e-07 14 8.444638e-07 0.172582 2.717018e-08 15 9.421889e-08 0.111572 3.031443e-09 # Output file: elast.out.1 14 6.166494e-04 0.164100 1.984037e-05 15 1.391252e-04 0.225615 4.476281e-06 16 2.117573e-05 0.152206 6.813178e-07 17 2.872939e-06 0.135671 9.243531e-08 18 6.923073e-07 0.240975 2.227462e-08 19 1.641146e-07 0.237055 5.280300e-09 # Output file: elast.out.2 12 8.670556e-04 0.177184 2.789706e-05 13 3.153597e-04 0.363713 1.014653e-05 14 5.627161e-05 0.178436 1.810509e-06 15 5.278098e-06 0.093797 1.698200e-07 16 8.783279e-07 0.166410 2.825974e-08 17 1.556180e-07 0.177175 5.006927e-09 # Output file: elast.out.3 13 2.845966e-04 0.329643 9.156746e-06 14 5.961917e-05 0.209487 1.918215e-06 15 8.522551e-06 0.142950 2.742086e-07 16 1.725429e-06 0.202455 5.551478e-08 17 5.059175e-07 0.293213 1.627763e-08 18 5.680426e-08 0.112280 1.827647e-09 # Output file: elast.out.4 13 7.466792e-04 0.200931 2.402401e-05 14 1.578734e-04 0.211434 5.079493e-06 15 4.801946e-05 0.304164 1.545001e-06 16 1.534974e-05 0.319657 4.938699e-07 17 2.491226e-06 0.162298 8.015387e-08 18 3.067633e-07 0.123137 9.869947e-09 # Output file: elast.out.5 9 9.841674e-04 0.097482 3.166507e-05 10 2.375490e-04 0.241371 7.643014e-06 11 3.406966e-05 0.143422 1.096173e-06 12 5.837305e-06 0.171334 1.878122e-07 13 1.380887e-06 0.236562 4.442930e-08 14 2.272992e-07 0.164604 7.313232e-09 # Output file: elast.out.6 9 6.193797e-04 0.172624 1.992822e-05 10 1.080160e-04 0.174394 3.475357e-06 11 1.217296e-05 0.112696 3.916587e-07 12 2.490164e-06 0.204565 8.011970e-08 13 4.278125e-07 0.171801 1.376464e-08 14 3.196541e-08 0.074718 1.028470e-09 # Output file: elast.out.7 11 1.391109e-03 0.250496 4.475819e-05 12 1.718162e-04 0.123510 5.528094e-06 13 2.271768e-05 0.132221 7.309294e-07 14 3.733169e-06 0.164329 1.201127e-07 15 7.783590e-07 0.208498 2.504329e-08 16 5.833470e-08 0.074946 1.876888e-09 # Output file: elast.out.8 20 2.046157e-04 0.413149 6.583403e-06 21 2.694826e-05 0.131702 8.670460e-07 22 2.020228e-05 0.749669 6.499976e-07 23 5.223484e-06 0.258559 1.680628e-07 24 1.683876e-06 0.322366 5.417781e-08 25 1.847586e-07 0.109722 5.944511e-09 # Output file: elast.out.9 17 8.002266e-05 0.287115 2.574687e-06 18 2.223319e-05 0.277836 7.153412e-07 19 4.609850e-06 0.207341 1.483195e-07 20 3.248518e-06 0.704691 1.045194e-07 21 5.453894e-07 0.167889 1.754762e-08 22 1.834674e-07 0.336397 5.902966e-09 # Output file: elast.out.10 18 6.592751e-05 0.352241 2.121183e-06 19 1.794198e-05 0.272147 5.772737e-07 20 6.127612e-06 0.341524 1.971527e-07 21 1.968147e-06 0.321193 6.332409e-08 22 3.630902e-07 0.184483 1.168224e-08 23 1.282387e-07 0.353187 4.126014e-09 # Output file: elast.out.11 17 3.404660e-05 0.165262 1.095431e-06 18 1.402890e-05 0.412050 4.513724e-07 19 5.152788e-06 0.367298 1.657882e-07 20 9.630675e-07 0.186902 3.098619e-08 21 3.720854e-07 0.386354 1.197165e-08 22 8.377304e-08 0.225145 2.695353e-09 hypre-2.18.2/src/test/TEST_ij/elast.sh000077500000000000000000000026031355566575400174370ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/interp.jobs000077500000000000000000000024641355566575400201600ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 # 1: Extended interpolation # 2: FF interpolation # 3: standard interpolation # 4: Extended interpolation and truncation max 4 elmts per row # 5: FF interpolation and truncation max 4 elmts per row # 6: standard interpolation and truncation max 4 elmts per row # 7: Classical modified interpolation #============================================================================= 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 hypre-2.18.2/src/test/TEST_ij/interp.saved000066400000000000000000000023271355566575400203200ustar00rootroot00000000000000# 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 hypre-2.18.2/src/test/TEST_ij/interp.sh000077500000000000000000000024541355566575400176340ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/matrix.jobs000077500000000000000000000027751355566575400201700ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -low_storage > 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 hypre-2.18.2/src/test/TEST_ij/matrix.saved000066400000000000000000000066601355566575400203270ustar00rootroot00000000000000# Output file: matrix.out.0 Average Convergence Factor = 0.173026 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 # Output file: matrix.out.1 Average Convergence Factor = 0.173026 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 # Output file: matrix.out.2 Average Convergence Factor = 0.173026 Complexity: grid = 1.555000 operator = 2.667344 cycle = 5.332187 # Output file: matrix.out.3 Average Convergence Factor = 0.000000 Complexity: grid = 1.000000 operator = 1.000000 cycle = 1.000000 # Output file: matrix.out.4 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 # Output file: matrix.out.5 ----- ------------ --------- ------------ 1 3.662930e+01 1.158320 1.158320e+00 2 2.975219e+01 0.812251 9.408470e-01 3 2.735458e+01 0.919414 8.650278e-01 4 1.871327e+01 0.684100 5.917655e-01 5 1.338639e+01 0.715342 4.233149e-01 # Output file: matrix.out.6 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 # Output file: matrix.out.7 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 # Output file: matrix.out.8 ----- ------------ --------- ------------ 1 3.662930e+01 1.158320 1.158320e+00 2 2.975219e+01 0.812251 9.408470e-01 3 2.735458e+01 0.919414 8.650278e-01 4 1.871327e+01 0.684100 5.917655e-01 5 1.338639e+01 0.715342 4.233149e-01 # Output file: matrix.out.9 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 # Output file: matrix.out.10 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 # Output file: matrix.out.11 Average Convergence Factor = 0.084659 Complexity: grid = 1.130435 operator = 1.162791 cycle = 2.162791 # Output file: matrix.out.12 ----- ------------ --------- ------------ 1 3.651484e+01 1.154701 1.154701e+00 2 2.779522e+01 0.761203 8.789620e-01 3 2.206259e+01 0.793755 6.976803e-01 4 1.558512e+01 0.706405 4.928447e-01 5 1.111687e+01 0.713300 3.515462e-01 hypre-2.18.2/src/test/TEST_ij/matrix.sh000077500000000000000000000040661355566575400176400ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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\ " for i in $FILES do echo "# Output file: $i" tail -21 $i | head -6 done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/rbm.0.00000000066400000000000000000000305261355566575400172740ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/rbm.0.00001000066400000000000000000000272101355566575400172710ustar00rootroot00000000000000504 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.18.2/src/test/TEST_ij/rbm.1.00000000066400000000000000000000303221355566575400172670ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/rbm.1.00001000066400000000000000000000264501355566575400172770ustar00rootroot00000000000000504 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.18.2/src/test/TEST_ij/rbm.2.00000000066400000000000000000000303221355566575400172700ustar00rootroot000000000000000 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.18.2/src/test/TEST_ij/rbm.2.00001000066400000000000000000000264501355566575400173000ustar00rootroot00000000000000504 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.18.2/src/test/TEST_ij/schw.00000000066400000000000000000000142721355566575400173220ustar00rootroot000000000000001 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.18.2/src/test/TEST_ij/schw.00001000066400000000000000000000000141355566575400173100ustar00rootroot0000000000000051 50 51 50 hypre-2.18.2/src/test/TEST_ij/schw.00002000066400000000000000000000144121355566575400173200ustar00rootroot0000000000000051 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.18.2/src/test/TEST_ij/smoother.jobs000077500000000000000000000064331355566575400205170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 \ -P 2 2 > 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 hypre-2.18.2/src/test/TEST_ij/smoother.saved000066400000000000000000000044301355566575400206540ustar00rootroot00000000000000# 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.334920e-09 # Output file: smoother.out.8 BoomerAMG Iterations = 11 Final Relative Residual Norm = 7.457693e-09 # Output file: smoother.out.9 BoomerAMG Iterations = 14 Final Relative Residual Norm = 4.118037e-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.12 Iterations = 6 Final Relative Residual Norm = 2.510138e-09 # Output file: smoother.out.13 Iterations = 5 Final Relative Residual Norm = 6.702216e-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 hypre-2.18.2/src/test/TEST_ij/smoother.sh000077500000000000000000000032041355566575400201650ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.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 files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_ij/solvers.jobs000077500000000000000000000150611355566575400203510ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 #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 #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 -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/multileve 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/multileve 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 hypre-2.18.2/src/test/TEST_ij/solvers.saved000066400000000000000000000135101355566575400205100ustar00rootroot00000000000000# 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.6 GMRES Iterations = 32 Final GMRES Relative Residual Norm = 6.756785e-09 # Output file: solvers.out.7 Iterations = 22 Final Relative Residual Norm = 9.936851e-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.289994e-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.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.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.sysh Average Convergence Factor = 0.122031 Complexity: grid = 1.613750 operator = 2.860187 cycle = 5.720205 # 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.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.500151e-09 # Output file: solvers.out.117 GMRES Iterations = 10 Final GMRES Relative Residual Norm = 1.006494e-09 # Output file: solvers.out.118 GMRES Iterations = 25 Final GMRES Relative Residual Norm = 9.464475e-09 # Output file: solvers.out.119 GMRES Iterations = 23 Final GMRES Relative Residual Norm = 9.269998e-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.980278e-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.980278e-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 = 5 Final Relative Residual Norm = 5.045978e-10 # Output file: solvers.out.207 MGR Iterations = 5 Final Relative Residual Norm = 7.248608e-10 # Output file: solvers.out.208 MGR Iterations = 11 Final Relative Residual Norm = 2.298028e-09 # Output file: solvers.out.209 MGR Iterations = 10 Final Relative Residual Norm = 2.965644e-09 # Output file: solvers.out.210 MGR Iterations = 8 Final Relative Residual Norm = 5.574880e-09 # Output file: solvers.out.211 MGR Iterations = 8 Final Relative Residual Norm = 5.306986e-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 hypre-2.18.2/src/test/TEST_ij/solvers.sh000077500000000000000000000070551355566575400200320ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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\ " for i in $FILES do echo "# Output file: $i" tail -5 $i done >> ${TNAME}.out 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 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\ ${TNAME}.out.118\ ${TNAME}.out.119\ ${TNAME}.out.120\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done >> ${TNAME}.out 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\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done >> ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -r ${TNAME}.mgr_testdata* hypre-2.18.2/src/test/TEST_ij/test.A.00000000066400000000000000000000004051355566575400175050ustar00rootroot000000000000007 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.18.2/src/test/TEST_ij/test.A.00001000066400000000000000000000004131355566575400175050ustar00rootroot0000000000000014 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.18.2/src/test/TEST_ij/test.A.00002000066400000000000000000000004251355566575400175110ustar00rootroot0000000000000023 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.18.2/src/test/TEST_ij/test.b.00000000066400000000000000000000001401355566575400175420ustar00rootroot000000000000008 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.18.2/src/test/TEST_ij/test.b.00001000066400000000000000000000002211355566575400175430ustar00rootroot0000000000000015 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.18.2/src/test/TEST_ij/test.b.00002000066400000000000000000000002271355566575400175520ustar00rootroot0000000000000024 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.18.2/src/test/TEST_lobpcg/000077500000000000000000000000001355566575400166335ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_lobpcg/ijdefault.jobs000077500000000000000000000051221355566575400214640ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_lobpcg/ijdefault.saved000066400000000000000000000065311355566575400216330ustar00rootroot00000000000000# Output file: lobpcg.out.vfromfile Eigenvalue lambda 2.43042158313018e-01 Eigenvalue lambda 4.79521039879688e-01 Residual 7.49244273975386e-08 Residual 3.13511570089364e-07 # Output file: lobpcg.out.vout.1 Eigenvalue lambda 2.43042159336231e-01 Eigenvalue lambda 4.79521040556427e-01 Residual 5.93138904669372e-05 Residual 3.00153697741728e-05 # Output file: lobpcg.out.1.lobpcg Iterations = 6 Final Relative Residual Norm = 1.767838e-07 # Output file: lobpcg.out.1.lobpcg.1 Eigenvalue lambda 2.43042158313718e-01 Residual 1.05888375241797e-06 # Output file: lobpcg.out.1.lobpcg.5 Eigenvalue lambda 2.43042158313047e-01 Eigenvalue lambda 4.79521039879736e-01 Eigenvalue lambda 4.79521039879869e-01 Eigenvalue lambda 4.79521039880020e-01 Eigenvalue lambda 7.15999921447659e-01 Residual 6.11700821392749e-07 Residual 7.03316483557853e-07 Residual 8.51096556735168e-07 Residual 8.72875343951290e-07 Residual 1.20344285081769e-06 # Output file: lobpcg.out.2.lobpcg Iterations = 20 Final Relative Residual Norm = 5.962015e-07 # Output file: lobpcg.out.2.lobpcg.1 Eigenvalue lambda 2.43042158313121e-01 Residual 4.63315030208772e-07 # Output file: lobpcg.out.2.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879677e-01 Eigenvalue lambda 4.79521039879700e-01 Eigenvalue lambda 4.79521039879780e-01 Eigenvalue lambda 7.15999921447091e-01 Residual 1.43322942857248e-07 Residual 4.86501096019624e-07 Residual 3.72232026886917e-07 Residual 5.18126375223749e-07 Residual 1.02530795888815e-06 # Output file: lobpcg.out.8.lobpcg Iterations = 15 Final Relative Residual Norm = 6.352784e-07 # Output file: lobpcg.out.8.lobpcg.1 Eigenvalue lambda 2.43042158313109e-01 Residual 4.35799317942064e-07 # Output file: lobpcg.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: lobpcg.out.12.lobpcg Iterations = 13 Final Relative Residual Norm = 3.896456e-07 # Output file: lobpcg.out.12.lobpcg.1 Eigenvalue lambda 2.43042158313099e-01 Residual 3.94665203904632e-07 # Output file: lobpcg.out.12.lobpcg.5 Eigenvalue lambda 2.43042158313016e-01 Eigenvalue lambda 4.79521039879675e-01 Eigenvalue lambda 4.79521039879685e-01 Eigenvalue lambda 4.79521039879788e-01 Eigenvalue lambda 7.15999921447147e-01 Residual 1.36414438599642e-07 Residual 4.59913522980684e-07 Residual 3.72152569537697e-07 Residual 5.07587948203054e-07 Residual 1.11208056285383e-06 # Output file: lobpcg.out.43.lobpcg Iterations = 9 Final Relative Residual Norm = 5.971754e-07 # Output file: lobpcg.out.43.lobpcg.1 Eigenvalue lambda 2.43042158313103e-01 Residual 4.06686999057609e-07 # Output file: lobpcg.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.18.2/src/test/TEST_lobpcg/ijdefault.sh000077500000000000000000000031311355566575400211370ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 FILES="\ ${TNAME}.out.1.lobpcg\ ${TNAME}.out.2.lobpcg\ ${TNAME}.out.8.lobpcg\ ${TNAME}.out.12.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 # Make sure that the output files are reasonable CHECK_LINE="Eigenvalue" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* rm -f residuals.txt values.txt vectors.[01].* hypre-2.18.2/src/test/TEST_lobpcg/ijoptions.jobs000077500000000000000000000056441355566575400215440ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_lobpcg/ijoptions.saved000066400000000000000000000040421355566575400216750ustar00rootroot00000000000000# options.out.default Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.no_orthchk Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.pcgitr.0 Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.pcgitr.1 Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.pcgitr.2 Eigenvalue lambda 2.43042158313018e-01 Residual 6.96799149848673e-08 # options.out.pcgtol.01 Eigenvalue lambda 2.43042158313018e-01 Residual 7.24629561863067e-08 # options.out.pcgtol.05 Eigenvalue lambda 2.43042158313023e-01 Residual 1.04744967214067e-07 # options.out.seed Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.seed.repeat Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.solver.none Eigenvalue lambda 2.43042158316676e-01 Residual 2.03104260070223e-06 # options.out.verb.1 Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.gen.1 Eigenvalue lambda 1.00000000000000e+00 Residual 7.54364534145478e-16 # options.out.gen.2 Eigenvalue lambda 3.14395676812973e-01 Residual 2.50125397358489e-07 # options.out.orthchk Eigenvalue lambda 2.43042158313013e-01 Residual 4.02732923495552e-08 # options.out.itr.100 Eigenvalue lambda 1.10912678978531e-01 Eigenvalue lambda 2.11917767568658e-01 Residual 1.05202923460143e-07 Residual 1.21965976773690e-03 # options.out.itr.2 Eigenvalue lambda 2.14273389869265e+00 Eigenvalue lambda 2.32122316003068e+00 Residual 1.68566474191610e+00 Residual 1.58810659347606e+00 # options.out.vrand.2 Eigenvalue lambda 2.43042158313021e-01 Eigenvalue lambda 4.79521039879676e-01 Residual 1.22006034989775e-07 Residual 2.33712989952824e-07 # options.out.verb.0 Complexity: grid = 1.555000 operator = 2.667344 # options.out.verb.2 Eigenvalue lambda 2.43042158313013e-01 Residual 4.027329e-08 ============================================= hypre-2.18.2/src/test/TEST_lobpcg/ijoptions.sh000077500000000000000000000064751355566575400212240ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -15 ${TNAME}.out.itr.100 | head -5 >> ${TNAME}.out echo "# ${TNAME}.out.itr.2" >> ${TNAME}.out tail -15 ${TNAME}.out.itr.2 | head -5 >> ${TNAME}.out echo "# ${TNAME}.out.vrand.2" >> ${TNAME}.out tail -15 ${TNAME}.out.vrand.2 | head -5 >> ${TNAME}.out echo "# ${TNAME}.out.verb.0" >> ${TNAME}.out tail -40 ${TNAME}.out.verb.0 | head -2 >> ${TNAME}.out echo "# ${TNAME}.out.verb.2" >> ${TNAME}.out tail -11 ${TNAME}.out.verb.2 | head -3 >> ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_lobpcg/sstruct.in.default000066400000000000000000000054751355566575400223300ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_lobpcg/sstruct.jobs000077500000000000000000000037761355566575400212410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_lobpcg/sstruct.saved000066400000000000000000000041741355566575400213740ustar00rootroot00000000000000# 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.18.2/src/test/TEST_lobpcg/sstruct.sh000077500000000000000000000025071355566575400207050ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_lobpcg/struct.jobs000077500000000000000000000044021355566575400210410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_lobpcg/struct.saved000066400000000000000000000057671355566575400212220ustar00rootroot00000000000000# 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.18.2/src/test/TEST_lobpcg/struct.sh000077500000000000000000000025411355566575400205200ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_longdouble/000077500000000000000000000000001355566575400175175ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_longdouble/solvers_ij.jobs000077500000000000000000000076021355566575400225650ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_longdouble/solvers_ij.saved000066400000000000000000000070451355566575400227300ustar00rootroot00000000000000# 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.081070e-17 # Output file: solvers_ij.out.3 GMRES Iterations = 199 Final GMRES Relative Residual Norm = 9.121629e-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 = 65 Final GMRES Relative Residual Norm = 9.781966e-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.081070e-17 # Output file: solvers_ij.out.11 Iterations = 10 PCG_Iterations = 7 DSCG_Iterations = 3 Final Relative Residual Norm = 1.094045e-17 # Output file: solvers_ij.out.sysh Average Convergence Factor = 0.122527 Complexity: grid = 1.613750 operator = 2.860373 cycle = 5.720578 # 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.430735 Complexity: grid = 1.614937 operator = 2.866488 cycle = 5.732598 # Output file: solvers_ij.out.101 LGMRES Iterations = 175 Final LGMRES Relative Residual Norm = 9.264825e-17 # Output file: solvers_ij.out.102 LGMRES Iterations = 17 Final LGMRES Relative Residual Norm = 2.721454e-17 # Output file: solvers_ij.out.103 FlexGMRES Iterations = 199 Final FlexGMRES Relative Residual Norm = 9.121063e-17 # Output file: solvers_ij.out.104 FlexGMRES Iterations = 14 Final FlexGMRES Relative Residual Norm = 2.081457e-17 # Output file: solvers_ij.out.105 Iterations = 27 Final Relative Residual Norm = 4.195866e-17 # Output file: solvers_ij.out.106 Iterations = 27 Final Relative Residual Norm = 4.195866e-17 # Output file: solvers_ij.out.107 Iterations = 41 Final Relative Residual Norm = 5.542245e-17 # Output file: solvers_ij.out.108 Iterations = 41 Final Relative Residual Norm = 5.542245e-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.418244e-17 # Output file: solvers_ij.out.113 GMRES Iterations = 50 Final GMRES Relative Residual Norm = 7.078678e-17 # Output file: solvers_ij.out.114 BoomerAMG Iterations = 33 Final Relative Residual Norm = 3.984250e-17 # Output file: solvers_ij.out.115 BoomerAMG Iterations = 33 Final Relative Residual Norm = 8.096418e-17 # Output file: solvers_ij.out.116 GMRES Iterations = 18 Final GMRES Relative Residual Norm = 3.003469e-17 # Output file: solvers_ij.out.117 GMRES Iterations = 18 Final GMRES Relative Residual Norm = 3.024076e-17 hypre-2.18.2/src/test/TEST_longdouble/solvers_ij.sh000077500000000000000000000051051355566575400222360ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 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 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 # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $CONVTOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_longdouble/solvers_struct.jobs000066400000000000000000000057161355566575400235100ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_longdouble/solvers_struct.saved000066400000000000000000000071251355566575400236510ustar00rootroot00000000000000# 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.90808378148735e-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.21720429474277e-08 Residual 6.44224703495451e-08 Residual 2.42812454193394e-07 Residual 3.37502151131599e-07 Residual 3.28950894745568e-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.18.2/src/test/TEST_longdouble/solvers_struct.sh000077500000000000000000000031601355566575400231570ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $CONVTOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_single/000077500000000000000000000000001355566575400166465ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_single/solvers_ij.jobs000077500000000000000000000075421355566575400217170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_single/solvers_ij.saved000066400000000000000000000070201355566575400220500ustar00rootroot00000000000000# Output file: solvers_ij.out.0 Iterations = 4 Final Relative Residual Norm = 1.622019e-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.566634e-05 # Output file: solvers_ij.out.3 GMRES Iterations = 39 Final GMRES Relative Residual Norm = 9.040770e-05 # Output file: solvers_ij.out.4 Iterations = 5 Final Relative Residual Norm = 1.566360e-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.131740e-05 # Output file: solvers_ij.out.7 Iterations = 13 Final Relative Residual Norm = 7.750608e-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.677458e-05 # Output file: solvers_ij.out.10 Iterations = 6 PCG_Iterations = 4 DSCG_Iterations = 2 Final Relative Residual Norm = 1.566634e-05 # Output file: solvers_ij.out.11 Iterations = 5 PCG_Iterations = 2 DSCG_Iterations = 3 Final Relative Residual Norm = 9.148609e-06 # Output file: solvers_ij.out.sysh Average Convergence Factor = 0.122042 Complexity: grid = 1.613750 operator = 2.860298 cycle = 5.720429 # Output file: solvers_ij.out.sysn Average Convergence Factor = 0.241065 Complexity: grid = 1.592000 operator = 2.633619 cycle = 11.267164 # Output file: solvers_ij.out.sysu Average Convergence Factor = 0.413666 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.223550e-05 # Output file: solvers_ij.out.102 LGMRES Iterations = 4 Final LGMRES Relative Residual Norm = 1.566634e-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.567694e-05 # Output file: solvers_ij.out.105 Iterations = 9 Final Relative Residual Norm = 2.436101e-05 # Output file: solvers_ij.out.106 Iterations = 9 Final Relative Residual Norm = 2.436101e-05 # Output file: solvers_ij.out.107 Iterations = 12 Final Relative Residual Norm = 6.371664e-05 # Output file: solvers_ij.out.108 Iterations = 12 Final Relative Residual Norm = 6.371664e-05 # Output file: solvers_ij.out.109 Iterations = 9 Final Relative Residual Norm = 8.952725e-05 # Output file: solvers_ij.out.110 Iterations = 9 Final Relative Residual Norm = 8.952696e-05 # Output file: solvers_ij.out.111 Iterations = 15 Final Relative Residual Norm = 8.953455e-05 # Output file: solvers_ij.out.112 GMRES Iterations = 12 Final GMRES Relative Residual Norm = 5.915735e-05 # Output file: solvers_ij.out.113 GMRES Iterations = 13 Final GMRES Relative Residual Norm = 7.913169e-05 # Output file: solvers_ij.out.114 BoomerAMG Iterations = 9 Final Relative Residual Norm = 3.746825e-05 # Output file: solvers_ij.out.115 BoomerAMG Iterations = 9 Final Relative Residual Norm = 3.886564e-05 # Output file: solvers_ij.out.116 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 3.062358e-05 # Output file: solvers_ij.out.117 GMRES Iterations = 6 Final GMRES Relative Residual Norm = 3.026567e-05 hypre-2.18.2/src/test/TEST_single/solvers_ij.sh000077500000000000000000000052101355566575400213620ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 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 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 # Make sure that the output files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $CONVTOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_single/solvers_struct.jobs000077500000000000000000000056521355566575400226410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_single/solvers_struct.saved000066400000000000000000000072301355566575400227750ustar00rootroot00000000000000# 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.18.2/src/test/TEST_single/solvers_struct.sh000077500000000000000000000031601355566575400223060ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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 # Make sure that the output files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $CONVTOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/000077500000000000000000000000001355566575400170745ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_sstruct/.psrc000066400000000000000000000002131355566575400200400ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_sstruct/addtovalues.jobs000077500000000000000000000023111355566575400222660ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/addtovalues.saved000066400000000000000000000013561355566575400224400ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/addtovalues.sh000077500000000000000000000046351355566575400217560ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/amr2d.jobs000077500000000000000000000027451355566575400207730ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/amr2d.saved000066400000000000000000000021661355566575400211320ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/amr2d.sh000077500000000000000000000032721355566575400204440ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/cube.jobs000077500000000000000000000007461355566575400207030ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/cube.saved000066400000000000000000000004051355566575400210350ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/cube.sh000077500000000000000000000035751355566575400203630ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/cycred.jobs000077500000000000000000000106141355566575400212310ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/cycred.saved000066400000000000000000000040371355566575400213750ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/cycred.sh000077500000000000000000000056201355566575400207070ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/default2d.jobs000077500000000000000000000016131355566575400216310ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/default2d.saved000066400000000000000000000004241355566575400217720ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/default2d.sh000077500000000000000000000035251355566575400213120ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/default3d.jobs000077500000000000000000000016201355566575400216300ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/default3d.saved000066400000000000000000000005601355566575400217740ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/default3d.sh000077500000000000000000000040261355566575400213100ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/emptyProc.jobs000077500000000000000000000172151355566575400217460ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/emptyProc.saved000066400000000000000000000064031355566575400221050ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/emptyProc.sh000077500000000000000000000032501355566575400214150ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 06 08 09\ 10 11 12 14 15 16 17 18 \ 20 21 22 23 24 25 26 27 28 29\ 30 31 32 33 34 35 36 37 38 \ " 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/maxwell.jobs000077500000000000000000000013031355566575400214240ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/maxwell.saved000066400000000000000000000004161355566575400215720ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/maxwell.sh000077500000000000000000000041211355566575400211020ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/miller.jobs000077500000000000000000000026421355566575400212460ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/miller.saved000066400000000000000000000015641355566575400214120ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/miller.sh000077500000000000000000000024371355566575400207250ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/neighborpart.jobs000077500000000000000000000037731355566575400224540ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/neighborpart.saved000066400000000000000000000034311355566575400226050ustar00rootroot00000000000000# 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 = 1.963879e-18 # Output file: neighborpart.out.61 Iterations = 5 Final Relative Residual Norm = 1.963879e-18 # Output file: neighborpart.out.62 Iterations = 5 Final Relative Residual Norm = 1.963879e-18 hypre-2.18.2/src/test/TEST_sstruct/neighborpart.sh000077500000000000000000000062451355566575400221260ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/neumann.jobs000077500000000000000000000036571355566575400214320ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/neumann.saved000066400000000000000000000020721355566575400215620ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/neumann.sh000077500000000000000000000050201355566575400210710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/periodic.jobs000077500000000000000000000111721355566575400215560ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 -rhsone \ > periodic.out.80 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellA -P 1 6 1 -solver 18 -rhsone \ > periodic.out.81 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellA -P 1 6 1 -solver 28 -rhsone \ > periodic.out.82 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 218 -rhsone \ > periodic.out.83 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 18 -rhsone \ > periodic.out.84 mpirun -np 6 ./sstruct -in sstruct.in.periodic.cellB -P 1 6 1 -solver 28 -rhsone \ > periodic.out.85 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 218 -rhsone \ > periodic.out.90 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 18 -rhsone \ > periodic.out.91 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeA -P 1 6 1 -solver 28 -rhsone \ > periodic.out.92 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 218 -rhsone \ > periodic.out.93 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 18 -rhsone \ > periodic.out.94 mpirun -np 6 ./sstruct -in sstruct.in.periodic.nodeB -P 1 6 1 -solver 28 -rhsone \ > periodic.out.95 hypre-2.18.2/src/test/TEST_sstruct/periodic.saved000066400000000000000000000050031355566575400217140ustar00rootroot00000000000000# 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 = 4 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.81 Iterations = 4 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.82 Iterations = 4 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.83 Iterations = 4 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.85 Iterations = 4 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.90 Iterations = 5 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.91 Iterations = 5 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.92 Iterations = 5 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.93 Iterations = 5 Final Relative Residual Norm = 0.000000e+00 # Output file: periodic.out.95 Iterations = 5 Final Relative Residual Norm = 0.000000e+00 hypre-2.18.2/src/test/TEST_sstruct/periodic.sh000077500000000000000000000107261355566575400212370ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 85\ 90 91 92 93 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/sharedpart.jobs000077500000000000000000000022671355566575400221220ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sharedpart.saved000066400000000000000000000016441355566575400222620ustar00rootroot00000000000000# 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.368642e-07 # Output file: sharedpart.out.51 Iterations = 5 Final Relative Residual Norm = 1.549669e-07 # Output file: sharedpart.out.52 Iterations = 5 Final Relative Residual Norm = 1.368642e-07 # Output file: sharedpart.out.53 Iterations = 7 Final Relative Residual Norm = 2.557686e-07 hypre-2.18.2/src/test/TEST_sstruct/sharedpart.sh000077500000000000000000000037161355566575400215770ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/solvers.jobs000077500000000000000000000032631355566575400214570ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/solvers.saved000066400000000000000000000035461355566575400216250ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/solvers.sh000077500000000000000000000027451355566575400211400ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/sstruct.in.19aniso000066400000000000000000000057641355566575400224310ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.19iso000066400000000000000000000056101355566575400221000ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.7aniso000066400000000000000000000046051355566575400223370ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.7iso000066400000000000000000000045111355566575400220140ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.addtoval_cellcentre000066400000000000000000000031301355566575400251250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.addtoval_edges000066400000000000000000000137441355566575400241100ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.amr.2D000066400000000000000000000034261355566575400221620ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.amr.2Db000066400000000000000000000034251355566575400223230ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.amr.2Dc000066400000000000000000000034201355566575400223170ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.amr.2De000066400000000000000000000041171355566575400223250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.amr.graphadd000066400000000000000000000101111355566575400234540ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.bcube000066400000000000000000000035421355566575400222160ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.bcube-fem000066400000000000000000000035111355566575400227570ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.block000066400000000000000000000033661355566575400222340ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cube000066400000000000000000000034011355566575400220460ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cube21000066400000000000000000000045101355566575400222130ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-1Dx000066400000000000000000000031561355566575400230420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-2Dx000066400000000000000000000032251355566575400230400ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-2Dy000066400000000000000000000032261355566575400230420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-3Dx000066400000000000000000000033001355566575400230330ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-3Dy000066400000000000000000000033011355566575400230350ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.cycred-3Dz000066400000000000000000000033011355566575400230360ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.default000066400000000000000000000054751355566575400225710ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.default_2D000066400000000000000000000043551355566575400231120ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.dirichlet000066400000000000000000000041511355566575400231020ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.emptyProc1000066400000000000000000000025361355566575400232030ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.emptyProc2000066400000000000000000000025301355566575400231760ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.emptyProc3000066400000000000000000000025361355566575400232050ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.enhanced3D000066400000000000000000000143141355566575400230710ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_2D000066400000000000000000000046201355566575400227650ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_2D_coord000066400000000000000000000046221355566575400241550ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_2Ds000066400000000000000000000046461355566575400231600ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_2Dss000066400000000000000000000046521355566575400233400ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_3D000066400000000000000000000116341355566575400227710ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all2_3D_coord000066400000000000000000000117051355566575400241560ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all3_3D000066400000000000000000000131731355566575400227720ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_all3_3D_coord000066400000000000000000000132461355566575400241610ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_node1_2D000066400000000000000000000044501355566575400231420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_node2_2D000066400000000000000000000057051355566575400231470ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_node2_2D_coord000066400000000000000000000057071355566575400243370ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.fe_rhombus5000066400000000000000000000110251355566575400233470ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.laps000066400000000000000000000037631355566575400221020ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.laps.periodic000066400000000000000000000035601355566575400236720ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.marinak000066400000000000000000000112271355566575400225570ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ########################################################### hypre-2.18.2/src/test/TEST_sstruct/sstruct.in.maxwell3d_unscaled000066400000000000000000000162731355566575400247210ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.miller_2blk000066400000000000000000000050021355566575400233250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.miller_2blk1000066400000000000000000000070631355566575400234170ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.miller_2stk000066400000000000000000000047651355566575400233750ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.miller_3blk000066400000000000000000000113131355566575400233300ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 ########################################################### hypre-2.18.2/src/test/TEST_sstruct/sstruct.in.miller_diag000066400000000000000000000030141355566575400234000ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.neumann000066400000000000000000000063261355566575400226020ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.neumann-yz000066400000000000000000000063321355566575400232370ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.noaddtoval_cellcentre000066400000000000000000000024271355566575400254720ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.noaddtoval_edges000066400000000000000000000133461355566575400244430ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.p19aniso000066400000000000000000000057541355566575400226100ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.p19iso000066400000000000000000000056001355566575400222570ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.p7aniso000066400000000000000000000045751355566575400225250ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.p7iso000066400000000000000000000045011355566575400221730ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.pcube000066400000000000000000000035421355566575400222340ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic000066400000000000000000000042771355566575400227420ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.2D000066400000000000000000000036501355566575400232000ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.add000066400000000000000000000032331355566575400234600ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.bigA000066400000000000000000000033051355566575400235720ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.bigB000066400000000000000000000033041355566575400235720ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.cellA000066400000000000000000000033221355566575400237470ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.cellB000066400000000000000000000036511355566575400237550ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.nodeA000066400000000000000000000033221355566575400237550ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.periodic.nodeB000066400000000000000000000037051355566575400237630ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.reduced3D000066400000000000000000000065041355566575400227410ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.reduced3D-4000066400000000000000000000066171355566575400231070ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.struct000066400000000000000000000034511355566575400224610ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm0000066400000000000000000000034011355566575400221750ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm0.2D000066400000000000000000000030121355566575400224370ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm1000066400000000000000000000035221355566575400222020ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm1.2D000066400000000000000000000031331355566575400224440ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm2000066400000000000000000000032201355566575400221760ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm2.2D000066400000000000000000000030051355566575400224430ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm3000066400000000000000000000030571355566575400222070ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.symm3.2D000066400000000000000000000026571355566575400224600ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct.in.wide.2D000066400000000000000000000044071355566575400223330ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/sstruct_struct.jobs000077500000000000000000000034271355566575400230770ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 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.18.2/src/test/TEST_sstruct/sstruct_struct.saved000066400000000000000000000022221355566575400232310ustar00rootroot00000000000000# 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.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.18.2/src/test/TEST_sstruct/sstruct_struct.sh000077500000000000000000000055261355566575400225560ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 #============================================================================= # 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.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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/symm.jobs000077500000000000000000000041141355566575400207430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/symm.saved000066400000000000000000000020401355566575400211010ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/symm.sh000077500000000000000000000070101355566575400204160ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/wide.jobs000077500000000000000000000006111355566575400207040ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/wide.saved000066400000000000000000000002561355566575400210530ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/wide.sh000077500000000000000000000030271355566575400203650ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/zcube.jobs000077500000000000000000000006141355566575400210670ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/zcube.saved000066400000000000000000000002601355566575400212260ustar00rootroot00000000000000# 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.18.2/src/test/TEST_sstruct/zcube.sh000077500000000000000000000031501355566575400205420ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_sstruct/zsstruct.in.bcube000066400000000000000000000033641355566575400224120ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_sstruct/zsstruct.in.cube000066400000000000000000000024301355566575400222410ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/000077500000000000000000000000001355566575400167115ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_struct/.psrc000066400000000000000000000002131355566575400176550ustar00rootroot00000000000000insure++.report_file insure.log insure++.report_overwrite false insure++.summarize leaks outstanding insure++.suppress EXPR_NULL,PARM_NULL hypre-2.18.2/src/test/TEST_struct/cgpfmg3d.jobs000077500000000000000000000014241355566575400212660ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/cgpfmg3d.saved000066400000000000000000000002641355566575400214310ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/cgpfmg3d.sh000077500000000000000000000031221355566575400207400ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/emptyproc.jobs000077500000000000000000000074171355566575400216260ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/emptyproc.saved000066400000000000000000000030671355566575400217650ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/emptyproc.sh000077500000000000000000000035671355566575400213050ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/hybrid.jobs000077500000000000000000000013431355566575400210550ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/hybrid.saved000066400000000000000000000006741355566575400212250ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/hybrid.sh000077500000000000000000000024001355566575400205250ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata hypre-2.18.2/src/test/TEST_struct/hybridswitch.jobs000077500000000000000000000016671355566575400223100ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/hybridswitch.saved000066400000000000000000000013641355566575400224440ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/hybridswitch.sh000077500000000000000000000024631355566575400217600ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata hypre-2.18.2/src/test/TEST_struct/migrate.jobs000077500000000000000000000015101355566575400212200ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/migrate.saved000066400000000000000000000007571355566575400213760ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/migrate.sh000077500000000000000000000024561355566575400207070ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Check" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= hypre-2.18.2/src/test/TEST_struct/parflow.jobs000077500000000000000000000027231355566575400212510ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/parflow.saved000066400000000000000000000010341355566575400214050ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/parflow.sh000077500000000000000000000045321355566575400207260ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/periodic.jobs000077500000000000000000000040201355566575400213650ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 for power-of-two systems #============================================================================= # 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 hypre-2.18.2/src/test/TEST_struct/periodic.saved000066400000000000000000000026741355566575400215440ustar00rootroot00000000000000# 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 hypre-2.18.2/src/test/TEST_struct/periodic.sh000077500000000000000000000062121355566575400210470ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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\ " for i in $FILES do echo "# Output file: $i" tail -3 $i done > ${TNAME}.out # Make sure that the output files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgbase1d.jobs000077500000000000000000000010771355566575400216110ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgbase1d.saved000066400000000000000000000002701355566575400217450ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgbase1d.sh000077500000000000000000000031011355566575400212540ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgbase2d.jobs000077500000000000000000000024701355566575400216100ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgbase2d.saved000066400000000000000000000010561355566575400217510ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgbase2d.sh000077500000000000000000000045251355566575400212700ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgbase3d.jobs000077500000000000000000000024261355566575400216120ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgbase3d.saved000066400000000000000000000013501355566575400217470ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgbase3d.sh000077500000000000000000000053331355566575400212670ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgconstcoeffmp.jobs000077500000000000000000000052201355566575400231320ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgconstcoeffmp.saved000066400000000000000000000037221355566575400233010ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgconstcoeffmp.sh000077500000000000000000000066141355566575400226170ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgorient.jobs000077500000000000000000000012411355566575400217430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgorient.saved000066400000000000000000000004241355566575400221070ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgorient.sh000077500000000000000000000034121355566575400214220ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgtest1d.jobs000077500000000000000000000012571355566575400216560ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgtest1d.saved000066400000000000000000000004241355566575400220130ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgtest1d.sh000077500000000000000000000023371355566575400213330ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/pfmgvcycle.jobs000077500000000000000000000010511355566575400217270ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/pfmgvcycle.saved000066400000000000000000000002721355566575400220750ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/pfmgvcycle.sh000077500000000000000000000023161355566575400214110ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then # diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/psmgbase3d.jobs000077500000000000000000000020021355566575400216150ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/psmgbase3d.saved000066400000000000000000000007141355566575400217670ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/psmgbase3d.sh000077500000000000000000000042121355566575400212770ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/psmgtest3d.jobs000077500000000000000000000017121355566575400216710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/psmgtest3d.saved000066400000000000000000000002701355566575400220310ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/psmgtest3d.sh000077500000000000000000000035301355566575400213460ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/smgbase1d.jobs000077500000000000000000000010721355566575400214410ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/smgbase1d.saved000066400000000000000000000002661355566575400216070ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/smgbase1d.sh000077500000000000000000000030741355566575400211220ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/smgbase2d.jobs000077500000000000000000000017421355566575400214460ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/smgbase2d.saved000066400000000000000000000007071355566575400216100ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/smgbase2d.sh000077500000000000000000000042211355566575400211160ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/smgbase3d.jobs000077500000000000000000000021161355566575400214430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/smgbase3d.saved000066400000000000000000000010421355566575400216020ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/smgbase3d.sh000077500000000000000000000045161355566575400211260ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/smgtest1d.jobs000077500000000000000000000012501355566575400215040ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/smgtest1d.saved000066400000000000000000000004211355566575400216450ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/smgtest1d.sh000077500000000000000000000023371355566575400211700ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/smgvcycle.jobs000077500000000000000000000007161355566575400215730ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/smgvcycle.saved000066400000000000000000000001331355566575400217260ustar00rootroot00000000000000# Output file: smgvcycle.out.0 Iterations = 7 Final Relative Residual Norm = 3.621850e-07 hypre-2.18.2/src/test/TEST_struct/smgvcycle.sh000077500000000000000000000022751355566575400212520ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/solvers.jobs000077500000000000000000000013071355566575400212710ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/solvers.saved000066400000000000000000000007001355566575400214270ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/solvers.sh000077500000000000000000000023121355566575400207430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/vcpfmgRedBlackGS.jobs000077500000000000000000000052651355566575400227070ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/vcpfmgRedBlackGS.saved000066400000000000000000000022401355566575400230370ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/vcpfmgRedBlackGS.sh000077500000000000000000000067171355566575400223670ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_struct/vdpfmgRedBlackGS.jobs000077500000000000000000000053041355566575400227020ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_struct/vdpfmgRedBlackGS.saved000066400000000000000000000022321355566575400230410ustar00rootroot00000000000000# 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.18.2/src/test/TEST_struct/vdpfmgRedBlackGS.sh000077500000000000000000000067171355566575400223700ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Iterations" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then #diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 (../runcheck.sh ${TNAME}.out ${TNAME}.saved $RTOL $ATOL) >&2 fi #============================================================================= # remove temporary files #============================================================================= rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_superlu/000077500000000000000000000000001355566575400170645ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_superlu/sludist.jobs000077500000000000000000000012721355566575400214370ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_superlu/sludist.saved000066400000000000000000000004511355566575400215770ustar00rootroot00000000000000# Output file: sludist.out.0 BoomerAMG Iterations = 11 Final Relative Residual Norm = 3.002696e-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.950884e-08 hypre-2.18.2/src/test/TEST_superlu/sludist.sh000077500000000000000000000022171355566575400211140ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 files are reasonable CHECK_LINE="Complexity" OUT_COUNT=`grep "$CHECK_LINE" ${TNAME}.out | wc -l` SAVED_COUNT=`grep "$CHECK_LINE" ${TNAME}.saved | wc -l` if [ "$OUT_COUNT" != "$SAVED_COUNT" ]; then echo "Incorrect number of \"$CHECK_LINE\" lines in ${TNAME}.out" >&2 fi if [ -z $HYPRE_NO_SAVED ]; then diff -U3 -bI"time" ${TNAME}.saved ${TNAME}.out >&2 fi #============================================================================= # remove temporary files #============================================================================= # rm -f ${TNAME}.testdata* hypre-2.18.2/src/test/TEST_timing/000077500000000000000000000000001355566575400166545ustar00rootroot00000000000000hypre-2.18.2/src/test/TEST_timing/efficiency.jobs000077500000000000000000000027221355566575400216450ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/TEST_timing/efficiency.sh000077500000000000000000000043601355566575400213220ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/ams_driver.c000066400000000000000000000625111355566575400170320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" 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, cycle_type, 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, G, Aalpha=0, Abeta=0, M=0; HYPRE_ParVector x0, b; HYPRE_ParVector Gx=0, Gy=0, Gz=0; HYPRE_ParVector x=0, y=0, z=0; HYPRE_ParVector interior_nodes; /* 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); /* Initialize Hypre */ HYPRE_Init(argc, argv); /* Set defaults */ solver_id = 3; maxit = 100; tol = 1e-6; dim = 3; coordinates = 0; h1_method = 0; singular_problem = 0; rlx_type = 2; rlx_sweeps = 1; rlx_weight = 1.0; rlx_omega = 1.0; cycle_type = 1; amg_coarsen_type = 10; amg_agg_levels = 1; amg_rlx_type = 8; /* 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], "-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], "-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 = 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 = 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 (100) \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); } } 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_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_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); /* 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); 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); /* Set up the AMS preconditioner */ HYPRE_AMSSetup(precond, A, b, x0); /* 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); /* 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_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.18.2/src/test/checktest.sh000077500000000000000000000027111355566575400170430ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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; } /* else if ( strcmp(argv[index], "-nopreload") == 0 ) { index++; preload = 0; } */ 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 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 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 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.18.2/src/test/ex1_for.c000066400000000000000000000342121355566575400162370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/ex3_for.c000066400000000000000000000463721355566575400162530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 = 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); free(values); #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); free(values); #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 } free(values); } /* 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 free(values); /* 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.18.2/src/test/ex5_for.c000066400000000000000000000514351355566575400162510ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 = 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 /* 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.18.2/src/test/ex7_for.c000066400000000000000000001564551355566575400162630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 (sin(5*PI*x)+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*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; } } 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 = 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 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. */ 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 free(values); } 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 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. */ { 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 } free(values); free(bvalues); } /* 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.18.2/src/test/f77_ij.f000066400000000000000000001067311355566575400157720ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/f77_ij_mv.f000066400000000000000000000310001355566575400164560ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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-vector interface !----------------------------------------------------------------------- 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 double precision cx, cy, cz integer generate_matrix, generate_vec character matfile(32), vecfile(32) character*32 matfile_str, vecfile_str integer*8 A, A_storage integer*8 x, b 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) double precision bvals(MAXZONS) double precision xvals(MAXZONS) double precision sum !----------------------------------------------------------------------- ! 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 cx = 1.0 cy = 1.0 cz = 1.0 !----------------------------------------------------------------------- ! Read options !----------------------------------------------------------------------- ! open( 5, file='parcsr_matrix_vector.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, *) cx ! read( 5, *) cy ! read( 5, *) cz ! ! 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 (<= 32 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 vector? !0 yes, 0 no (from file)' read(5,*) generate_vec if (generate_vec .eq. 0) then ! write(6,*) ! & 'What file to use for vector (<= 32 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 ! 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 !----------------------------------------------------------------------- ! Print driver parameters !----------------------------------------------------------------------- if (myid .eq. 0) then print *, 'Matrix built with these parameters:' print *, ' (nx, ny, nz) = (', nx, ',', ny, ',', nz, ')' print *, ' (Px, Py, Pz) = (', Px, ',', Py, ',', Pz, ')' print *, ' (cx, cy, cz) = (', cx, ',', cy, ',', cz, ')' 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 .gt. 0) then ! Standard 7-point laplacian in 3D with grid and anisotropy ! determined as user settings. 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) if (ierr .ne. 0) write(6,*) 'Matrix object set failed' call HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR, ierr) else call HYPRE_IJMatrixRead(matfile, MPI_COMM_WORLD, & HYPRE_PARCSR, A, ierr) if (ierr .ne. 0) write(6,*) 'Matrix read failed' call HYPRE_IJMatrixGetObject(A, A_storage, ierr) if (ierr .ne. 0) & write(6,*) 'Matrix object retrieval failed' call HYPRE_ParCSRMatrixGetLocalRange(A_storage, & first_local_row, last_local_row, & first_local_col, last_local_col, ierr) if (ierr .ne. 0) & write(6,*) 'Matrix local range retrieval failed' endif matfile(1) = 'm' matfile(2) = 'v' matfile(3) = '.' matfile(4) = 'o' matfile(5) = 'u' matfile(6) = 't' matfile(7) = '.' matfile(8) = 'A' matfile(9) = char(0) call HYPRE_IJMatrixPrint(A, matfile, ierr) if (ierr .ne. 0) write(6,*) 'Matrix print failed' !----------------------------------------------------------------------- ! "RHS vector" test !----------------------------------------------------------------------- if (generate_vec .gt. 0) then call HYPRE_IJVectorCreate(MPI_COMM_WORLD, first_local_row, & last_local_row, b, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector creation failed' call HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector object set failed' call HYPRE_IJVectorInitialize(b, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector initialization failed' ! Set up a Dirichlet 0 problem do i = 1, last_local_row - first_local_row + 1 indices(i) = first_local_row - 1 + i vals(i) = 0. enddo call HYPRE_IJVectorSetValues(b, & last_local_row - first_local_row + 1, indices, vals, ierr) vecfile(1) = 'm' vecfile(2) = 'v' vecfile(3) = '.' vecfile(4) = 'o' vecfile(5) = 'u' vecfile(6) = 't' vecfile(7) = '.' vecfile(8) = 'b' vecfile(9) = char(0) call HYPRE_IJVectorPrint(b, vecfile, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector print failed' else call HYPRE_IJVectorRead(vecfile, MPI_COMM_WORLD, & HYPRE_PARCSR, b, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector read failed' endif do i = 1, last_local_row - first_local_row + 1 indices(i) = first_local_row - 1 + i enddo call HYPRE_IJVectorGetValues(b, & last_local_row - first_local_row + 1, indices, bvals, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector value retrieval failed' ! Set about to modify every other component of b, by adding the ! negative of the component do i = 1, last_local_row - first_local_row + 1, 2 indices(i) = first_local_row - 1 + i vals(i) = -bvals(i) enddo call HYPRE_IJVectorAddToValues(b, & 1 + (last_local_row - first_local_row)/2, indices, vals, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector value addition failed' do i = 1, last_local_row - first_local_row + 1 indices(i) = first_local_row - 1 + i enddo call HYPRE_IJVectorGetValues(b, & last_local_row - first_local_row + 1, indices, bvals, ierr) if (ierr .ne. 0) write(6,*) 'RHS vector value retrieval failed' sum = 0. do i = 1, last_local_row - first_local_row + 1, 2 sum = sum + bvals(i) enddo if (sum .ne. 0.) write(6,*) 'RHS vector value addition error' !----------------------------------------------------------------------- ! "Solution vector" test !----------------------------------------------------------------------- call HYPRE_IJVectorCreate(MPI_COMM_WORLD, first_local_col, & last_local_col, x, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector creation failed' call HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector object set failed' call HYPRE_IJVectorInitialize(x, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector initialization', & ' failed' 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) if (ierr .ne. 0) write(6,*) 'Solution vector value set failed' vecfile(1) = 'm' vecfile(2) = 'v' vecfile(3) = '.' vecfile(4) = 'o' vecfile(5) = 'u' vecfile(6) = 't' vecfile(7) = '.' vecfile(8) = 'x' vecfile(9) = char(0) call HYPRE_IJVectorPrint(x, vecfile, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector print failed' indices(1) = last_local_col indices(2) = first_local_col vals(1) = -99. vals(2) = -45. call HYPRE_IJVectorAddToValues(x, 2, indices, vals, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector value addition', & ' failed' do i = 1, last_local_col - first_local_col + 1 indices(i) = first_local_col - 1 + i enddo call HYPRE_IJVectorGetValues(x, & last_local_col - first_local_col + 1, indices, xvals, ierr) if (ierr .ne. 0) write(6,*) 'Solution vector value retrieval', & ' failed' if (xvals(1) .ne. -45.) & write(6,*) 'Solution vector value addition error,', & ' first_local_col' if (xvals(last_local_col - first_local_col + 1) .ne. -99.) & write(6,*) 'Solution vector value addition error,', & ' last_local_col' !----------------------------------------------------------------------- ! 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.18.2/src/test/f77_struct.f000066400000000000000000000513251355566575400167120ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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 include 'mpif.h' parameter (MAXZONS=4194304) parameter (MAXBLKS=32) parameter (MAXDIM=3) 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 zero, one integer maxiter, dscgmaxiter, pcgmaxiter double precision tol, 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 solver_id = 0 istart(1) = -3 istart(2) = -3 istart(3) = -3 !----------------------------------------------------------------------- ! Read options !----------------------------------------------------------------------- ! 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, *) solver_id ! ! 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 print *, ' solver ID = ', solver_id 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. maxiter = 50 dscgmaxiter = 100 pcgmaxiter = 50 tol = 0.000001 convtol = 0.9 if (solver_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, maxiter, ierr) call HYPRE_StructSMGSetTol(solver, 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 (solver_id .eq. 1) then ! Solve the system using PFMG call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructPFMGSetMaxIter(solver, maxiter, ierr) call HYPRE_StructPFMGSetTol(solver, 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_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 ((solver_id .gt. 9) .and. (solver_id .lt. 20)) then ! Solve the system using CG precond_id = -1 call HYPRE_StructPCGCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructPCGSetMaxIter(solver, maxiter, ierr) call HYPRE_StructPCGSetTol(solver, tol, ierr) call HYPRE_StructPCGSetTwoNorm(solver, one, ierr) call HYPRE_StructPCGSetRelChange(solver, zero, ierr) call HYPRE_StructPCGSetLogging(solver, one, ierr) if (solver_id .eq. 10) then ! use symmetric SMG as preconditioner precond_id = 0 maxiter = 1 tol = 0.0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, maxiter, ierr) call HYPRE_StructSMGSetTol(precond, tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) call HYPRE_StructPCGSetPrecond(solver, precond_id, precond, & ierr) elseif (solver_id .eq. 11) then ! use symmetric PFMG as preconditioner precond_id = 1 maxiter = 1 tol = 0.0 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, maxiter, ierr) call HYPRE_StructPFMGSetTol(precond, 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) call HYPRE_StructPCGSetPrecond(solver, precond_id, precond, & ierr) elseif (solver_id .eq. 18) then ! use diagonal scaling as preconditioner precond_id = 8 precond = zero call HYPRE_StructPCGSetPrecond(solver, precond_id, precond, & ierr) elseif (solver_id .eq. 19) then ! use diagonal scaling as preconditioner precond_id = 9 call HYPRE_StructPCGSetPrecond(solver, precond_id, precond, & ierr) endif 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) if (solver_id .eq. 10) then call HYPRE_StructSMGDestroy(precond, ierr) elseif (solver_id .eq. 11) then call HYPRE_StructPFMGDestroy(precond, ierr) endif elseif ((solver_id .gt. 19) .and. (solver_id .le. 30)) then ! Solve the system using Hybrid precond_id = -1 call HYPRE_StructHybridCreate(MPI_COMM_WORLD, solver, ierr) call HYPRE_StructHybridSetDSCGMaxIte(solver, dscgmaxiter, ierr) call HYPRE_StructHybridSetPCGMaxIter(solver, pcgmaxiter, ierr) call HYPRE_StructHybridSetTol(solver, 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 (solver_id .eq. 20) then ! use symmetric SMG as preconditioner precond_id = 0 maxiter = 1 tol = 0.0 call HYPRE_StructSMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructSMGSetMemoryUse(precond, zero, ierr) call HYPRE_StructSMGSetMaxIter(precond, maxiter, ierr) call HYPRE_StructSMGSetTol(precond, tol, ierr) call HYPRE_StructSMGSetNumPreRelax(precond, n_pre, ierr) call HYPRE_StructSMGSetNumPostRelax(precond, n_post, ierr) call HYPRE_StructSMGSetLogging(precond, zero, ierr) elseif (solver_id .eq. 21) then ! use symmetric PFMG as preconditioner precond_id = 1 maxiter = 1 tol = 0.0 call HYPRE_StructPFMGCreate(MPI_COMM_WORLD, precond, & ierr) call HYPRE_StructPFMGSetMaxIter(precond, maxiter, ierr) call HYPRE_StructPFMGSetTol(precond, 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) endif call HYPRE_StructHybridSetPrecond(solver, precond_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) if (solver_id .eq. 20) then call HYPRE_StructSMGDestroy(precond, ierr) elseif (solver_id .eq. 21) then call HYPRE_StructPFMGDestroy(precond, ierr) endif endif !----------------------------------------------------------------------- ! Print the solution and other info !----------------------------------------------------------------------- ! call HYPRE_StructVectorPrint("driver.out.x", x, zero, ierr) if (myid .eq. 0) then print *, 'Iterations = ', num_iterations print *, '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.18.2/src/test/fei.cxx000066400000000000000000000523111355566575400160170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fei_lscore.c000066400000000000000000000366471355566575400170240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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] = 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] = 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] = 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]= 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.18.2/src/test/fparcsr_ls.f000066400000000000000000003646301355566575400170470ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fparcsr_mv.f000066400000000000000000000437221355566575400170470ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fsstruct_ls.f000066400000000000000000002006271355566575400172570ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fsstruct_mv.f000066400000000000000000001050671355566575400172650ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fstruct_ls.f000066400000000000000000002327451355566575400171020ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/fstruct_mv.f000066400000000000000000000567371355566575400171130ustar00rootroot00000000000000! Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/hypre_ij_fortran_test.h000066400000000000000000000163061355566575400213100ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/hypre_parcsr_fortran_test.h000066400000000000000000002277561355566575400222150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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.18.2/src/test/hypre_set_precond.c000066400000000000000000000700641355566575400204150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 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.18.2/src/test/hypre_sstruct_fortran_test.h000066400000000000000000001202741355566575400224150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/hypre_struct_fortran_test.h000066400000000000000000001515301355566575400222310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/hypre_test.h000066400000000000000000000061541355566575400170730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/test/ij.c000066400000000000000000012163661355566575400153130ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 HYPRE_USING_DSUPERLU #include "superlu_ddefs.h" #endif /* begin lobpcg */ #define NO_SOLVER -9198 #include #include #include "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.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 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_BigInt *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_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 #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 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_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 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 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 = NULL; HYPRE_IJVector ij_b = NULL; HYPRE_IJVector ij_x = NULL; HYPRE_IJVector *ij_rbm; HYPRE_ParCSRMatrix parcsr_A = NULL; HYPRE_ParVector b = NULL; HYPRE_ParVector x; HYPRE_ParVector *interp_vecs = NULL; HYPRE_ParVector residual = NULL; HYPRE_Solver amg_solver; HYPRE_Solver pcg_solver; HYPRE_Solver pcg_precond=NULL, pcg_precond_gotten; HYPRE_Int check_residual = 0; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_Int *row_sizes; 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 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_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 = DT_INF; HYPRE_Real dt = dt_inf; /* parameters for BoomerAMG */ HYPRE_Real A_drop_tol = 0.0; HYPRE_Int A_drop_type = -1; HYPRE_Real strong_threshold; HYPRE_Real strong_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; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int rap2=0; HYPRE_Int mod_rap2=0; HYPRE_Int keepTranspose = 1; #else HYPRE_Int rap2=0; HYPRE_Int mod_rap2=0; HYPRE_Int keepTranspose = 0; #endif #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; 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 converge_type = 0; 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; /* 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 rel_change = 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 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_Int *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_Real *nongalerk_tol = NULL; HYPRE_Int nongalerk_num_tol = 0; 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; /*----------------------------------------------------------- * 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 ); time_index = hypre_InitializeTiming("Hypre init"); hypre_BeginTiming(time_index); /* Initialize Hypre */ HYPRE_Init(argc, argv); hypre_EndTiming(time_index); hypre_PrintTiming("Hypre init times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); #ifdef HYPRE_USING_CUDA //hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); hypre_SetExecPolicy(HYPRE_EXEC_HOST); #endif //omp_set_default_device(0); //nvtxDomainHandle_t domain = nvtxDomainCreateA("Domain_A"); /* hypre_InitMemoryDebug(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_x0_type = -1; build_x0_arg_index = argc; build_funcs_type = 0; build_funcs_arg_index = argc; 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], "-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], "-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], "-x0fromfile") == 0 ) { arg_index++; build_x0_type = 0; 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], "-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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crst") == 0 ) { arg_index++; CR_strong_th = 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], "-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 = 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 = 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 */ else if ( strcmp(argv[arg_index], "-exec_host") == 0 ) { arg_index++; hypre_SetExecPolicy(HYPRE_EXEC_HOST); } else if ( strcmp(argv[arg_index], "-exec_device") == 0 ) { arg_index++; hypre_SetExecPolicy(HYPRE_EXEC_DEVICE); } 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) { strong_threshold = strong_thresholdR = 0.25; 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-wl") == 0 ) { arg_index++; relax_wt_level = atof(argv[arg_index++]); level_w = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ow") == 0 ) { arg_index++; outer_wt = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-owl") == 0 ) { arg_index++; outer_wt_level = atof(argv[arg_index++]); level_ow = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sw") == 0 ) { arg_index++; schwarz_rlx_weight = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-coarse_th") == 0 ) { arg_index++; coarse_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-adroptol") == 0 ) { arg_index++; A_drop_tol = 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], "-min_cs") == 0 ) { arg_index++; min_coarse_size = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seq_th") == 0 ) { arg_index++; seq_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-red") == 0 ) { arg_index++; redundant = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-thR") == 0 ) { arg_index++; strong_thresholdR = 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 = 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], "-conv_type") == 0 ) { arg_index++; converge_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-atol") == 0 ) { arg_index++; atol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxrs") == 0 ) { arg_index++; max_row_sum = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_th") == 0 ) { arg_index++; sai_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_filt") == 0 ) { arg_index++; sai_filter = 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], "-ilut") == 0 ) { arg_index++; eu_ilut = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sparseA") == 0 ) { arg_index++; eu_sparse_A = 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 = 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 = 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Ssw") == 0 ) { arg_index++; S_commpkg_switch = 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++]); } 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_tr") == 0 ) { arg_index++; agg_P12_trunc_factor = 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_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 = 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 = 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 = 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] = 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 if ( strcmp(argv[arg_index], "-AIR") == 0 ) { arg_index++; air = 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 */ 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]\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(" -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(" -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(" 43=Euclid-PCG 44=Euclid-GMRES \n"); hypre_printf(" 45=Euclid-BICGSTAB\n"); hypre_printf(" 46=Euclid-COGMRES\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("\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(" 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(" -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(" -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 */ } goto final; } /*----------------------------------------------------------- * 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); build_rhs_type = 6; build_src_type = 5; } 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 = (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(); /* 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_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; 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_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.; 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_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[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. 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_CTAlloc(HYPRE_Int, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); rows = hypre_CTAlloc(HYPRE_BigInt, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); col_inds = hypre_CTAlloc(HYPRE_BigInt, 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); 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); rows[j] = big_i; ncols[j] = 1; col_inds[j] = big_i; values[j] = val; } ierr += HYPRE_IJMatrixAddToValues( ij_A, local_num_rows, ncols, rows, (const HYPRE_BigInt *) 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./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; } else if ( build_rhs_type == 6) { ij_b = NULL; } 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; } 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 */ values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); hypre_SeedRand(myid+2747); 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; } /* initial guess */ if ( build_x0_type == 0 ) { /* 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); } ierr = HYPRE_IJVectorRead( 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 == 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 */ 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) { if (ij_A) { HYPRE_IJMatrixPrint(ij_A, "IJ.out.A"); } else if (parcsr_A) { hypre_ParCSRMatrixPrintIJ(parcsr_A, 0, 0, "IJ.out.A"); } 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"); /* 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_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); if (relax_type > -1) 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_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_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); 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); } /* 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_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, 3); 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_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 (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_BoomerAMGSetup(amg_solver, parcsr_A, b, x); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) cudaDeviceSynchronize(); #endif 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); //PUSH_RANGE("solve", 1) HYPRE_BoomerAMGSolve(amg_solver, parcsr_A, b, x); //POP_RANGE #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) cudaDeviceSynchronize(); #endif 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_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_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_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 *-----------------------------------------------------------*/ /* begin lobpcg */ if (!lobpcgFlag && (solver_id == 1 || solver_id == 2 || solver_id == 8 || solver_id == 12 || solver_id == 14 || solver_id == 43 || solver_id == 71)) /*end lobpcg */ { 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); 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_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_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_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_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_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_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_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); 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 == 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 -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_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxIter(amg_solver, 1); HYPRE_BoomerAMGSetTol(amg_solver, 0.0); /* 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_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); } 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 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; 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 (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_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, 1); 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_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_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, 1); 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_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_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 ); free( eigenvalues ); 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_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, 1); 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_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_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, 1); 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_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 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 ); free( eigenvalues ); } /* 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); 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); if (air) { /* RL: specify restriction */ hypre_assert(restri_type >= 0); HYPRE_BoomerAMGSetRestriction(pcg_precond, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ HYPRE_BoomerAMGSetGridRelaxPoints(pcg_precond, grid_relax_points); HYPRE_BoomerAMGSetStrongThresholdR(amg_solver, strong_thresholdR); } HYPRE_BoomerAMGSetCGCIts(pcg_precond, cgcits); HYPRE_BoomerAMGSetInterpType(pcg_precond, interp_type); HYPRE_BoomerAMGSetRestriction(pcg_precond, restri_type); /* 0: P^T, 1: AIR, 2: AIR-2 */ 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_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_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 (ns_down > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_down, 1); } if (ns_up > -1) { HYPRE_BoomerAMGSetCycleNumSweeps(pcg_precond, ns_up, 2); } 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, 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_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_BoomerAMGSetMaxLevels(pcg_precond, max_levels); HYPRE_BoomerAMGSetMaxRowSum(pcg_precond, max_row_sum); HYPRE_BoomerAMGSetDebugFlag(pcg_precond, debug_flag); 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); } 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 (check_residual) { HYPRE_BigInt *indices; 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 = hypre_CTAlloc(HYPRE_BigInt, num_values, HYPRE_MEMORY_HOST); values = hypre_CTAlloc(HYPRE_Real, num_values, HYPRE_MEMORY_HOST); for (i=0; i < num_values; i++) indices[i] = first_local_row+i; HYPRE_ParVectorGetValues((HYPRE_ParVector) residual,num_values,indices,values); for (i=0; i < num_values; i++) if (myid ==0) hypre_printf("index %d value %e\n", i, values[i]); hypre_TFree(indices, HYPRE_MEMORY_HOST); hypre_TFree(values, HYPRE_MEMORY_HOST); } #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_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_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_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_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 || solver_id == 72) { 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_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_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_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 -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_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); HYPRE_BoomerAMGSetMaxIter(amg_solver, 1); HYPRE_BoomerAMGSetTol(amg_solver, 0.0); /* 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 == 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); } 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 -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_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_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); 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 -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_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_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 -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_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_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"); } } /*----------------------------------------------------------- * 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 -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_BoomerAMGSetRelaxOrder(amg_solver, 1); HYPRE_BoomerAMGSetMaxLevels(amg_solver, max_levels); HYPRE_BoomerAMGSetSmoothType(amg_solver, smooth_type); HYPRE_BoomerAMGSetSmoothNumSweeps(amg_solver, smooth_num_sweeps); if(mgr_nlevels < 1 || mgr_bsize < 2) { HYPRE_BoomerAMGSetMaxIter(amg_solver, max_iter); HYPRE_BoomerAMGSetPrintLevel(amg_solver, 3); } else { HYPRE_BoomerAMGSetMaxIter(amg_solver, 1); 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_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("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(); 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"); } #if SECOND_TIME /* run a second time to check for memory leaks */ HYPRE_ParVectorSetRandomValues(x, 775); HYPRE_MGRSetup(mgr_solver, parcsr_A, b, x); HYPRE_MGRSolve(mgr_solver, parcsr_A, b, x); #endif /* 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 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 = 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 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_ParCSRMatrix A; HYPRE_CSRMatrix A_CSR = NULL; HYPRE_Int myid, numprocs; HYPRE_Int i, rest, size, num_nodes, num_dofs; HYPRE_BigInt *row_part; HYPRE_BigInt *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_BigInt, 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_BigInt *partitioning; HYPRE_Int *dof_func; 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(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_BigInt *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_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 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, 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = 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 = 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 = 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.18.2/src/test/ij_device.c000066400000000000000000002016271355566575400166230ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 ); #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_ParCSRMatrix parcsr_S = NULL; HYPRE_ParCSRMatrix parcsr_S_device = NULL; HYPRE_Int *h_CF_marker, *h_CF_marker2, *d_CF_marker; HYPRE_Int errcode; HYPRE_Int num_procs, myid; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; 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, *coarse_dof_func, *coarse_pnts_global, *col_offd_S_to_A; /* parameters for BoomerAMG */ HYPRE_Real trunc_factor = 0.0; HYPRE_Int P_max_elmts = 8; HYPRE_Int cycle_type; HYPRE_Int coarsen_type = 10; HYPRE_Int measure_type = 0; HYPRE_Int debug_flag = 0; HYPRE_Int num_CR_relax_steps = 2; HYPRE_Int rap2=0; HYPRE_Int keepTranspose = 0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Real max_row_sum = 1.0; HYPRE_Real fnorm, rfnorm, fnorm0; /* interpolation */ HYPRE_Int interp_type = 6; /* default value */ HYPRE_Int post_interp_type = 0; /* default value */ HYPRE_Int restri_type = 0; HYPRE_Int print_system = 0; HYPRE_Int mult_order = 0; HYPRE_Int use_cusparse = 0; HYPRE_Int rowest_mtd = 3; HYPRE_Int rowest_nsamples = 32; HYPRE_Real rowest_mult = 1.0; char hash_type = 'L'; HYPRE_Int nC1 = 0, nC2 = 0, i; /*----------------------------------------------------------- * 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 ); /* Initialize Hypre */ HYPRE_Init(argc, argv); 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], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_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], "-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], "-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], "-restritype") == 0 ) { arg_index++; restri_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else if ( strcmp(argv[arg_index], "-tr") == 0 ) { arg_index++; trunc_factor = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = 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], "-interptype") == 0 ) { arg_index++; interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-order") == 0 ) { arg_index++; mult_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cusparse") == 0 ) { arg_index++; use_cusparse = 1; } 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 = 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], "-hash") == 0 ) { arg_index++; hash_type = argv[arg_index++][0];; } else { arg_index++; } } /*----------------------------------------------------------- * 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(" -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(" -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(" 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"); hypre_printf(" -restritype : set restriction type\n"); hypre_printf(" 0=transpose of the interpolation \n"); hypre_printf(" 1=local approximate ideal restriction (AIR) \n"); hypre_printf("\n"); hypre_printf(" -Pmx : set maximal no. of elmts per row for AMG interpolation (default: 4)\n"); } goto final; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { } errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMethod(rowest_mtd); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateNSamples(rowest_nsamples); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMultFactor(rowest_mult); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetHashType(hash_type); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetUseCusparse(use_cusparse); hypre_assert(errcode == 0); /*----------------------------------------------------------- * 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_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 ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; } hypre_BoomerAMGCreateS(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S); parcsr_S_device = hypre_ParCSRMatrixClone_v2(parcsr_S, 0, HYPRE_MEMORY_DEVICE); hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* PMIS on HOST */ time_index = hypre_InitializeTiming("Host PMIS"); hypre_BeginTiming(time_index); hypre_BoomerAMGCoarsenPMIS(parcsr_S, parcsr_A, 0, debug_flag, &h_CF_marker); hypre_EndTiming(time_index); hypre_PrintTiming("Host PMIS", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /* PMIS on DEVICE */ hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 0, debug_flag, &d_CF_marker); hypre_TFree(d_CF_marker, HYPRE_MEMORY_DEVICE); time_index = hypre_InitializeTiming("Device PMIS"); hypre_BeginTiming(time_index); hypre_BoomerAMGCoarsenPMISDevice(parcsr_S_device, parcsr_A, 0, debug_flag, &d_CF_marker); hypre_EndTiming(time_index); hypre_PrintTiming("Device PMIS", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); local_num_rows = last_local_row - first_local_row + 1; 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 (h_CF_marker[i] > 0) { nC1++; } hypre_assert(h_CF_marker2[i] == 1 || h_CF_marker2[i] == -1 || h_CF_marker2[i] == -3); hypre_assert(h_CF_marker[i] == h_CF_marker2[i]); if (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); } /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ if (build_matrix_type == -1) { HYPRE_IJMatrixDestroy(ij_A); } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } hypre_TFree(h_CF_marker, HYPRE_MEMORY_HOST); hypre_TFree(h_CF_marker2, HYPRE_MEMORY_HOST); hypre_TFree(d_CF_marker, HYPRE_MEMORY_DEVICE); hypre_TFree(coarse_dof_func, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(parcsr_S); hypre_ParCSRMatrixDestroy(parcsr_S_device); final: /* 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 = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = 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 = 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 = 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 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = 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 = 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 = 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.18.2/src/test/ij_mm.c000066400000000000000000002133251355566575400157730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 ); #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_ParCSRMatrix parcsr_S = NULL; HYPRE_ParCSRMatrix parcsr_P = NULL; HYPRE_ParCSRMatrix parcsr_Q = NULL; HYPRE_ParCSRMatrix parcsr_AH = NULL; HYPRE_ParCSRMatrix parcsr_A_device = NULL; HYPRE_ParCSRMatrix parcsr_P_device = NULL; HYPRE_ParCSRMatrix parcsr_Q_device = NULL; HYPRE_ParCSRMatrix parcsr_AH_device = NULL; HYPRE_ParCSRMatrix parcsr_Q_2 = NULL; HYPRE_ParCSRMatrix parcsr_AH_2 = NULL; HYPRE_ParCSRMatrix parcsr_error = NULL; HYPRE_Int *CF_marker; HYPRE_Int errcode; HYPRE_Int num_procs, myid; HYPRE_Int time_index; MPI_Comm comm = hypre_MPI_COMM_WORLD; 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, *coarse_dof_func, *coarse_pnts_global, *col_offd_S_to_A; /* parameters for BoomerAMG */ HYPRE_Real trunc_factor = 0.0; HYPRE_Int P_max_elmts = 8; HYPRE_Int cycle_type; HYPRE_Int coarsen_type = 10; HYPRE_Int measure_type = 0; HYPRE_Int debug_flag = 0; HYPRE_Int num_CR_relax_steps = 2; HYPRE_Int rap2=0; HYPRE_Int keepTranspose = 0; HYPRE_Int num_functions = 1; HYPRE_Real strong_threshold = 0.25; HYPRE_Real max_row_sum = 1.0; HYPRE_Real fnorm, rfnorm, fnorm0; /* interpolation */ HYPRE_Int interp_type = 6; /* default value */ HYPRE_Int post_interp_type = 0; /* default value */ HYPRE_Int restri_type = 0; HYPRE_Int print_system = 0; HYPRE_Int mult_order = 0; HYPRE_Int use_cusparse = 0; HYPRE_Int rowest_mtd = 3; HYPRE_Int rowest_nsamples = 32; HYPRE_Real rowest_mult = 1.0; char hash_type = 'L'; /*----------------------------------------------------------- * 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 ); /* Initialize Hypre */ HYPRE_Init(argc, argv); //hypre_SetNumThreads(20); 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], "-concrete_parcsr") == 0 ) { arg_index++; build_matrix_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], "-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], "-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], "-restritype") == 0 ) { arg_index++; restri_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-help") == 0 ) { print_usage = 1; } else if ( strcmp(argv[arg_index], "-tr") == 0 ) { arg_index++; trunc_factor = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = 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], "-interptype") == 0 ) { arg_index++; interp_type = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-print") == 0 ) { arg_index++; print_system = 1; } else if ( strcmp(argv[arg_index], "-order") == 0 ) { arg_index++; mult_order = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-cusparse") == 0 ) { arg_index++; use_cusparse = 1; } 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 = 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], "-hash") == 0 ) { arg_index++; hash_type = argv[arg_index++][0];; } else { arg_index++; } } /*----------------------------------------------------------- * 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(" -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(" -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(" 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"); hypre_printf(" -restritype : set restriction type\n"); hypre_printf(" 0=transpose of the interpolation \n"); hypre_printf(" 1=local approximate ideal restriction (AIR) \n"); hypre_printf("\n"); hypre_printf(" -Pmx : set maximal no. of elmts per row for AMG interpolation (default: 4)\n"); } goto final; } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { } errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMethod(rowest_mtd); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateNSamples(rowest_nsamples); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetRownnzEstimateMultFactor(rowest_mult); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetHashType(hash_type); hypre_assert(errcode == 0); errcode = HYPRE_CSRMatrixDeviceSpGemmSetUseCusparse(use_cusparse); hypre_assert(errcode == 0); /*----------------------------------------------------------- * 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_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 ); local_num_rows = last_local_row - first_local_row + 1; local_num_cols = last_local_col - first_local_col + 1; } /* generate P */ hypre_BoomerAMGCreateS(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S); /* hypre_BoomerAMGCreateSabs(parcsr_A, strong_threshold, max_row_sum, num_functions, NULL, &parcsr_S); */ hypre_BoomerAMGCoarsenHMIS(parcsr_S, parcsr_A, measure_type, debug_flag, &CF_marker); local_num_vars = hypre_CSRMatrixNumRows(hypre_ParCSRMatrixDiag(parcsr_A)); coarse_dof_func = NULL; coarse_pnts_global = NULL; col_offd_S_to_A = NULL; hypre_BoomerAMGCoarseParms(hypre_ParCSRMatrixComm(parcsr_A), local_num_vars, num_functions, NULL, CF_marker, &coarse_dof_func, &coarse_pnts_global); hypre_BoomerAMGBuildExtPIInterp(parcsr_A, CF_marker, parcsr_S, coarse_pnts_global, num_functions, NULL, debug_flag, trunc_factor, P_max_elmts, col_offd_S_to_A, &parcsr_P); if (myid == 0) { printf("A %d x %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_A), hypre_ParCSRMatrixGlobalNumCols(parcsr_A)); printf("P %d x %d\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_P), hypre_ParCSRMatrixGlobalNumCols(parcsr_P)); } hypre_EndTiming(time_index); hypre_PrintTiming("Generate Matrix", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Matrix-by-Matrix on host *-----------------------------------------------------------*/ time_index = hypre_InitializeTiming("Host Parcsr Matrix-by-Matrix, RAP2"); hypre_BeginTiming(time_index); 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); } hypre_EndTiming(time_index); hypre_PrintTiming("Host Parcsr Matrix-by-Matrix, RAP2", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Print out the matrices *-----------------------------------------------------------*/ if (print_system) { /* hypre_ParCSRMatrixPrintIJ(parcsr_A, 1, 1, "IJ.out.A"); hypre_ParCSRMatrixPrintIJ(parcsr_P, 1, 1, "IJ.out.P"); hypre_ParCSRMatrixPrintIJ(parcsr_Q, 1, 1, "IJ.out.Q"); */ hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_A), 1, 1, 0, "/p/gpfs1/li50/A.mtx"); hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_P), 1, 1, 0, "/p/gpfs1/li50/P.mtx"); /* hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_Q), 1, 1, 0, "/p/gscratchr/li50/Q.mtx"); hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_P), 1, 1, 1, "/p/gscratchr/li50/PT.mtx"); */ //hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_A), 1, 1, 0, "A.mtx"); //hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_P), 1, 1, 0, "P.mtx"); //hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_Q), 1, 1, 0, "Q.mtx"); //hypre_CSRMatrixPrintMM(hypre_ParCSRMatrixDiag(parcsr_P), 1, 1, 1, "PT.mtx"); } /*----------------------------------------------------------- * Matrix-by-Matrix on device *-----------------------------------------------------------*/ parcsr_A_device = hypre_ParCSRMatrixClone_v2(parcsr_A, 1, HYPRE_MEMORY_DEVICE); parcsr_P_device = hypre_ParCSRMatrixClone_v2(parcsr_P, 1, HYPRE_MEMORY_DEVICE); //printf("done clone to GPU\n"); hypre_MatvecCommPkgCreate(parcsr_A_device); hypre_MatvecCommPkgCreate(parcsr_P_device); /* run for the first time without timing [some allocation is done] */ if (mult_order == 0) { parcsr_Q_device = hypre_ParCSRMatMat(parcsr_A_device, parcsr_P_device); parcsr_AH_device = hypre_ParCSRTMatMatKT(parcsr_P_device, parcsr_Q_device, keepTranspose); } else { parcsr_Q_device = hypre_ParCSRTMatMatKT(parcsr_P_device, parcsr_A_device, keepTranspose); parcsr_AH_device = hypre_ParCSRMatMat(parcsr_Q_device, parcsr_P_device); } hypre_ParCSRMatrixDestroy(parcsr_Q_device); hypre_ParCSRMatrixDestroy(parcsr_AH_device); //printf("done 1st GPU run\n"); time_index = hypre_InitializeTiming("Device Parcsr Matrix-by-Matrix, RAP2"); hypre_BeginTiming(time_index); /* run for a second time for timing */ //cudaProfilerStart(); if (mult_order == 0) { parcsr_Q_device = hypre_ParCSRMatMat(parcsr_A_device, parcsr_P_device); parcsr_AH_device = hypre_ParCSRTMatMatKT(parcsr_P_device, parcsr_Q_device, keepTranspose); } else { parcsr_Q_device = hypre_ParCSRTMatMatKT(parcsr_P_device, parcsr_A_device, keepTranspose); parcsr_AH_device = hypre_ParCSRMatMat(parcsr_Q_device, parcsr_P_device); } //cudaProfilerStop(); hypre_EndTiming(time_index); hypre_PrintTiming("Device Parcsr Matrix-by-Matrix, RAP2", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Verify results *-----------------------------------------------------------*/ //parcsr_Q_2 = hypre_ParCSRMatrixClone_v2(parcsr_Q_device, 1, HYPRE_MEMORY_HOST); //hypre_ParCSRMatrixPrintIJ(parcsr_Q, 0, 0, "IJ.out.Q"); //hypre_ParCSRMatrixPrintIJ(parcsr_Q_2, 0, 0, "IJ.out.Q_2"); parcsr_AH_2 = hypre_ParCSRMatrixClone_v2(parcsr_AH_device, 1, HYPRE_MEMORY_HOST); hypre_ParcsrAdd(1.0, parcsr_AH, -1.0, parcsr_AH_2, &parcsr_error); fnorm = hypre_ParCSRMatrixFnorm(parcsr_error); fnorm0 = hypre_ParCSRMatrixFnorm(parcsr_AH); rfnorm = fnorm0 > 0 ? fnorm / fnorm0 : fnorm; hypre_ParCSRMatrixSetNumNonzeros(parcsr_AH_2); if (myid == 0) { printf("AH: %d x %d, nnz %d, CPU-GPU err %e\n", hypre_ParCSRMatrixGlobalNumRows(parcsr_AH_2), hypre_ParCSRMatrixGlobalNumCols(parcsr_AH_2), hypre_ParCSRMatrixNumNonzeros(parcsr_AH_2), rfnorm); } /* hypre_ParCSRMatrixPrintIJ(parcsr_AH, 0, 0, "IJ.out.AH"); hypre_ParCSRMatrixPrintIJ(parcsr_AH_2, 0, 0, "IJ.out.AH_2"); */ hypre_ParCSRMatrixDestroy(parcsr_error); /*----------------------------------------------------------- * Finalize things *-----------------------------------------------------------*/ if (build_matrix_type == -1) { HYPRE_IJMatrixDestroy(ij_A); } else { HYPRE_ParCSRMatrixDestroy(parcsr_A); } hypre_TFree(CF_marker, HYPRE_MEMORY_HOST); hypre_TFree(coarse_dof_func, HYPRE_MEMORY_HOST); hypre_ParCSRMatrixDestroy(parcsr_S); hypre_ParCSRMatrixDestroy(parcsr_P); hypre_ParCSRMatrixDestroy(parcsr_Q); hypre_ParCSRMatrixDestroy(parcsr_AH); hypre_ParCSRMatrixDestroy(parcsr_A_device); hypre_ParCSRMatrixDestroy(parcsr_P_device); hypre_ParCSRMatrixDestroy(parcsr_Q_device); hypre_ParCSRMatrixDestroy(parcsr_AH_device); final: /* 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 = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = 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 = 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 = 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 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = 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 = 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 = 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.18.2/src/test/ij_mv.c000066400000000000000000001402101355566575400157740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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-vector 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. *--------------------------------------------------------------------------*/ #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_krylov.h" 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_BigInt *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_Real norm; void *object; HYPRE_IJMatrix ij_A; HYPRE_IJVector ij_b=NULL; HYPRE_IJVector ij_x=NULL; HYPRE_IJVector ij_v; HYPRE_ParCSRMatrix parcsr_A; HYPRE_ParVector b; HYPRE_ParVector x; HYPRE_Int num_procs, myid; HYPRE_Int local_row; HYPRE_BigInt *indices; HYPRE_Int *row_sizes; HYPRE_Int *diag_sizes; HYPRE_Int *offdiag_sizes; HYPRE_BigInt *rows; HYPRE_Int size; HYPRE_Int *ncols; HYPRE_BigInt *col_inds; MPI_Comm comm = hypre_MPI_COMM_WORLD; HYPRE_Int time_index; HYPRE_Int ierr = 0; HYPRE_BigInt M, N, big_i; HYPRE_Int i, j; 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_Real *values; /*----------------------------------------------------------- * 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; /*----------------------------------------------------------- * Parse command line *-----------------------------------------------------------*/ print_usage = 0; arg_index = 1; while ( (arg_index < argc) && (!print_usage) ) { if ( strcmp(argv[arg_index], "-fromijfile") == 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], "-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], "-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], "-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(" -fromijfile : "); hypre_printf("matrix read in IJ format from distributed files\n"); hypre_printf(" -fromparcsrfile : "); hypre_printf("matrix read in ParCSR format from distributed files\n"); hypre_printf(" -fromonecsrfile : "); hypre_printf("matrix read in CSR format from a file on one processor\n"); hypre_printf("\n"); hypre_printf(" -laplacian [] : build laplacian problem\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 : rhs read in IJ form from distributed files\n"); hypre_printf(" -rhsfromonefile : rhs read from a file one one processor\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"); exit(1); } /*----------------------------------------------------------- * Print driver parameters *-----------------------------------------------------------*/ if (myid == 0) { hypre_printf("Running with these driver parameters:\n"); } /*----------------------------------------------------------- * Set up matrix *-----------------------------------------------------------*/ 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 ) { BuildParFromOneFile(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 { hypre_printf("You have asked for an unsupported test 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 < 2) { 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; ierr = HYPRE_IJMatrixInitialize( ij_A ); } 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); 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 (big_i=first_local_row; big_i<= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, 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_A, big_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 (big_i=first_local_row; big_i<= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, big_i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &size, &big_i, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, 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; 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 (big_i=first_local_row; big_i<= last_local_row; big_i++) { ierr += HYPRE_ParCSRMatrixGetRow( parcsr_A, big_i, &size, &col_inds, &values ); ierr += HYPRE_IJMatrixSetValues( ij_A, 1, &size, &big_i, (const HYPRE_BigInt *) col_inds, (const HYPRE_Real *) values ); ierr += HYPRE_ParCSRMatrixRestoreRow( parcsr_A, big_i, &size, &col_inds, &values ); } } ierr += HYPRE_IJMatrixAssemble( ij_A ); } hypre_EndTiming(time_index); hypre_PrintTiming("Initial 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); } time_index = hypre_InitializeTiming("Backward Euler Time Step"); hypre_BeginTiming(time_index); /* 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_BigInt, last_local_row - first_local_row + 1, HYPRE_MEMORY_HOST); col_inds = hypre_CTAlloc(HYPRE_BigInt, 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); for (big_i = first_local_row; big_i <= last_local_row; big_i++) { j = (HYPRE_Int)(big_i - first_local_row); rows[j] = big_i; ncols[j] = 1; col_inds[j] = big_i; values[j] = -27.8; } ierr += HYPRE_IJMatrixAddToValues( ij_A, local_num_rows, ncols, rows, (const HYPRE_BigInt *) 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 ); hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Diagonal Augmentation", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * 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; HYPRE_IJVectorCreate(hypre_MPI_COMM_WORLD, first_local_col, last_local_col, &ij_v); HYPRE_IJVectorSetObjectType(ij_v, HYPRE_PARCSR ); HYPRE_IJVectorInitialize(ij_v); values = hypre_CTAlloc(HYPRE_Real, local_num_cols, HYPRE_MEMORY_HOST); /*------------------------------------------------------------------- * Check HYPRE_IJVectorSet(Get)Values calls * * All local components changed -- NULL indices *-------------------------------------------------------------------*/ for (i = 0; i < local_num_cols; i++) values[i] = 1.; HYPRE_IJVectorSetValues(ij_v, local_num_cols, NULL, values); for (i = 0; i < local_num_cols; i++) values[i] = (HYPRE_Real)i; HYPRE_IJVectorAddToValues(ij_v, local_num_cols/2, NULL, values); HYPRE_IJVectorGetValues(ij_v, local_num_cols, NULL, values); ierr = 0; for (i = 0; i < local_num_cols/2; i++) if (values[i] != (HYPRE_Real)i + 1.) ++ierr; for (i = local_num_cols/2; i < local_num_cols; i++) if (values[i] != 1.) ++ierr; if (ierr) { hypre_printf("One of HYPRE_IJVectorSet(AddTo,Get)Values\n"); hypre_printf("calls with NULL indices bad\n"); hypre_printf("IJVector Error 1 with ierr = %d\n", ierr); exit(1); } /*------------------------------------------------------------------- * All local components changed, assigned reverse-ordered values * as specified by indices *-------------------------------------------------------------------*/ indices = hypre_CTAlloc(HYPRE_BigInt, local_num_cols, HYPRE_MEMORY_HOST); for (big_i = first_local_col; big_i <= last_local_col; big_i++) { j = (HYPRE_Int)(big_i - first_local_col); values[j] = (HYPRE_Real)big_i; indices[j] = last_local_col - big_i; } HYPRE_IJVectorSetValues(ij_v, local_num_cols, indices, values); for (big_i = first_local_col; big_i <= last_local_col; big_i++) { j = (HYPRE_Int)(big_i - first_local_col); values[j] = (HYPRE_Real)big_i*big_i; } HYPRE_IJVectorAddToValues(ij_v, local_num_cols, indices, values); HYPRE_IJVectorGetValues(ij_v, local_num_cols, indices, values); hypre_TFree(indices, HYPRE_MEMORY_HOST); ierr = 0; for (big_i = first_local_col; big_i <= last_local_col; big_i++) { j = (HYPRE_Int)(big_i - first_local_col); if (values[j] != (HYPRE_Real)(big_i*big_i + big_i)) ++ierr; } if (ierr) { hypre_printf("One of HYPRE_IJVectorSet(Get)Values\n"); hypre_printf("calls bad\n"); hypre_printf("IJVector Error 2 with ierr = %d\n", ierr); exit(1); } HYPRE_IJVectorDestroy(ij_v); /*----------------------------------------------------------- * 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 */ BuildRhsParFromOneFile(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.; 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./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; } hypre_EndTiming(time_index); hypre_PrintTiming("IJ Vector Setup", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * 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_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_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) = (%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.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_BigInt 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) = (%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 ); /*----------------------------------------------------------- * 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 = 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(" FromFile: %s\n", filename); /*----------------------------------------------------------- * Generate the matrix *-----------------------------------------------------------*/ A_CSR = HYPRE_CSRMatrixRead(filename); } HYPRE_CSRMatrixToParCSRMatrix(hypre_MPI_COMM_WORLD, A_CSR, NULL, NULL, &A); *A_ptr = A; if (myid == 0) 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_BigInt *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_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", 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) = (%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.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.18.2/src/test/maxwell_unscaled.c000066400000000000000000002131061355566575400202240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_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); 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] = 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] = 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] = 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; 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_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; /*----------------------------------------------------------- * 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); /* Initialize Hypre */ HYPRE_Init(argc, argv); /*----------------------------------------------------------- * 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; /*----------------------------------------------------------- * 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], "-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 *-----------------------------------------------------------*/ 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_SHARED); 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; } } 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]); } } } } } /* 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]; 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]); } } } } } 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]= 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); HYPRE_SStructVectorSetBoxValues(b, part, ilower, iupper, var, 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; } 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, 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_SHARED); 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(); return (0); } hypre-2.18.2/src/test/new_ij.c000066400000000000000000006505441355566575400161630ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crst") == 0 ) { arg_index++; CR_strong_th = 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 = 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-wl") == 0 ) { arg_index++; relax_wt_level = atof(argv[arg_index++]); level_w = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-ow") == 0 ) { arg_index++; outer_wt = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-owl") == 0 ) { arg_index++; outer_wt_level = atof(argv[arg_index++]); level_ow = atoi(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sw") == 0 ) { arg_index++; schwarz_rlx_weight = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-coarse_th") == 0 ) { arg_index++; coarse_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-min_cs") == 0 ) { arg_index++; min_coarse_size = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-seq_th") == 0 ) { arg_index++; seq_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-red") == 0 ) { arg_index++; redundant = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-th") == 0 ) { arg_index++; strong_threshold = 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 = 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], "-atol") == 0 ) { arg_index++; atol = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-mxrs") == 0 ) { arg_index++; max_row_sum = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_th") == 0 ) { arg_index++; sai_threshold = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sai_filt") == 0 ) { arg_index++; sai_filter = 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], "-ilut") == 0 ) { arg_index++; eu_ilut = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-sparseA") == 0 ) { arg_index++; eu_sparse_A = 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 = 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 = 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-Ssw") == 0 ) { arg_index++; S_commpkg_switch = 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-agg_P12_tr") == 0 ) { arg_index++; agg_P12_trunc_factor = 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 = 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 = 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] = 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./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 = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = 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 = 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 = 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\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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-eps") == 0 ) { arg_index++; eps = 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 = 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 = 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.18.2/src/test/runcheck.sh000077500000000000000000000046131355566575400166730ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 rtol = $RTOL, atol = $ATOL" awk -v filename="$SNAME" 'BEGIN{ FS=" "; key = 0; # Read saved file data into array while (getline < filename) { if(NF > 0 && substr($1,1,1) !~ /#/) { saved_line[key]=$0; saved_array[++key]=$NF; } } close(filename); # read out file and compare filename="'"$FNAME"'" 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 key=0; ln=0; pass=1; while (getline < filename) { ln++; if(NF > 0 && substr($1,1,1) !~ /#/) { # get corresponding value in saved array val = saved_array[++key]; # floating point field comparison if($NF != int($NF)) { err = val - $NF; # get absolute value of err and val err = err < 0 ? -err : err; val = val < 0 ? -val : val; # abs err <= atol or rel err <= rtol if(err <= atol || err <= rtol*val) { #print "PASSED" } else { pass=0; printf "(%d) - %s\n", ln, saved_line[key-1] printf "(%d) + %s (err %.2e)\n\n", ln, $0, err #printf "(%d) + %s <-- %s, err %.2e\n", ln, $0, val, err } } else # integer comparison { tau = val - $NF; # get absolute value of tau tau = tau < 0 ? -tau : tau; # get ceiling of rtol*val (= max allowed change) gamma = int(1.0 + rtol*val); if(tau <= gamma) { #print "PASSED" } else { pass=0; printf "(%d) %s <-- %s, err %d\n", ln, $0, val, tau } } } } }' #if [ "x$PASSFAIL" != "x" ]; #then # echo $PASSFAIL # diff -U3 -bI"time" $SNAME $FNAME >&2 #fi hypre-2.18.2/src/test/runtest.sh000077500000000000000000000412151355566575400165740ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 variables BatchMode=0 NoRun=0 JobCheckInterval=10 # sleep time between jobs finished check InputString="" RunPrefix=`type -p mpirun` RunPrefix="$RunPrefix -np" RunString="" RunEcho="" ExecFileNames="" # string of executable file names used TestDirNames="" # string of names of TEST_* directories used HOST=`hostname` NumThreads=0 # number of OpenMP threads to use if > 0 Valgrind="" # string to add to MpirunString when using valgrind mpibind="" # string to add to MpirunString when using mpibind 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 " -valgrind use valgrind memory checker\n" printf " -mpibind use mpibind\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 { 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" ;; rztopaz*|aztec*|cab*|quartz*|sierra*|syrah*|vulcan*) shift if [ $NumThreads -gt 0 ] ; then export OMP_NUM_THREADS=$NumThreads RunString="srun -p pdebug -c $NumThreads -n$*" else RunString="srun -p pdebug -n$*" fi ;; surface*) shift RunString="srun -n$*" ;; *) shift if [ $NumThreads -gt 0 ] ; then export OMP_NUM_THREADS=$NumThreads fi RunString="$RunPrefix $1" shift RunString="$RunString $mpibind $Valgrind $*" ;; esac } # 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 InputFile=$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/^[ \t]*mpirun[ \t]*//'` # remove 'mpirun' RunCmd=`echo $RunCmd | sed -e 's/[ \t]*>.*$//'` # 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=$InputFile.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/$InputFile.jobs" echo "--> $InputLine" exit 1 fi ;; esac done < $InputFile.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 InputFile=$3 RTOL=$4 ATOL=$5 SavePWD=`pwd` cd $WorkingDir (cat $InputFile.err.* > $InputFile.err) (./$InputFile.sh $RTOL $ATOL >> $InputFile.err 2>> $InputFile.err) cd $SavePWD } # report errors from PURIFY and/or INSURE if run function PostProcess { StartDir=$1 WorkingDir=$2 InputFile=$3 SavePWD=`pwd` cd $WorkingDir if [ "$BatchMode" -eq 0 ] ; then if [ -f purify.log ] ; then mv purify.log $InputFile.purify.log grep -i hypre_ $InputFile.purify.log >> $InputFile.err elif [ -f insure.log ] ; then if [ -f ~/insure.log ] ; then cat ~/insure.log >> insure.log rm -f ~/insure.log* fi mv insure.log $InputFile.insure.log grep -i hypre_ $InputFile.insure.log >> $InputFile.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 ;; -valgrind) shift Valgrind="valgrind -q --suppressions=`pwd`/runtest.valgrind --leak-check=yes --track-origins=yes" ;; -mpibind) shift mpibind="mpibind" ;; -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.18.2/src/test/runtest.valgrind000066400000000000000000000000001355566575400177500ustar00rootroot00000000000000hypre-2.18.2/src/test/sstruct.c000066400000000000000000007022251355566575400164110ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" /* begin lobpcg */ #include #include "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.h" #define NO_SOLVER -9198 /* end lobpcg */ #define DEBUG 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_Real *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; /* 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_Int fem_rhs_true; HYPRE_Real *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] = 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; /*----------------------------------------------------------- * 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.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] = strtod(sdata_ptr, &sdata_ptr); } else if ( strcmp(key, "RhsSet:") == 0 ) { if (data.rhs_true == 0) { data.rhs_true = 1; } data.rhs_value = 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); } 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.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] = 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] = 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] = 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); 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 ) { 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); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); 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 ) { 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); hypre_TFree(pdata.graph_values, HYPRE_MEMORY_HOST); 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); } if (data.fem_rhs_true > 0) { hypre_TFree(data.fem_rhs_values, HYPRE_MEMORY_HOST); } 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 * cos((i+j+k)/10.0); count++; } } } /* hypre_Index loop_size,stride,start; hypre_Box *dbox; dbox = hypre_BoxCreate(3); hypre_BoxSetExtents(dbox,ilower,iupper); hypre_SubtractIndexes(iupper,ilower,3,loop_size); hypre_SetIndex(stride,1); hypre_SetIndex(start,0); ASSERT_MANAGED(values); hypre_BoxLoop1Begin(3,loop_size,dbox,start,stride,count) { hypre_Index id; hypre_newBoxLoopGetIndex(id); values[count] = scale * cos((id[0]+id[1]+id[2])/10.0); } hypre_BoxLoop1End(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("\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(" -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[] ) { char *infile; ProblemData global_data; ProblemData data; ProblemPartData pdata; HYPRE_Int nparts; HYPRE_Int pooldist; HYPRE_Int *parts; Index *refine; Index *distribute; Index *block; HYPRE_Int solver_id, object_type; HYPRE_Int print_system; HYPRE_Int cosine; HYPRE_Real scale; HYPRE_SStructGrid grid, G_grid; HYPRE_SStructStencil *stencils, *G_stencils; HYPRE_SStructGraph graph, G_graph; HYPRE_SStructMatrix A, G; HYPRE_SStructVector b; HYPRE_SStructVector x; 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_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 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 */ /*----------------------------------------------------------- * 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); /* Initialize Hypre */ HYPRE_Init(argc, argv); /*----------------------------------------------------------- * 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++]; } 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); } } ReadData(infile, &global_data); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ skip = 0; rap = 0; relax = 1; usr_jacobi_weight= 0; jump = 0; solver_type = 1; recompute_res = 0; /* What should be the default here? */ cf_tol = 0.90; nparts = global_data.nparts; pooldist = 0; 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; } } cycred_tdim = 0; for (i = 0; i < 3; i++) { cycred_index[i] = 0; cycred_stride[i] = 1; } solver_id = 39; print_system = 0; cosine = 1; if (global_data.rhs_true || global_data.fem_rhs_true) { cosine = 0; } skip = 0; n_pre = 1; n_post = 1; old_default = 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], "-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], "-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 = 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= 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 = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-crtdim") == 0 ) { arg_index++; cycred_tdim = atof(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 = 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 { arg_index++; /*break;*/ } } if ( solver_id == 39 && lobpcgFlag ) solver_id = 10; /* end lobpcg */ /*----------------------------------------------------------- * Print driver parameters TODO *-----------------------------------------------------------*/ if (myid == 0) { } /*----------------------------------------------------------- * 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); } } /*----------------------------------------------------------- * 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); 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 *-----------------------------------------------------------*/ object_type = HYPRE_SSTRUCT; /* determine if we build a gradient matrix */ gradient_matrix = 0; 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(hypre_MPI_COMM_WORLD, 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 = hypre_TAlloc(HYPRE_Real, hypre_max(data.max_boxsize, data.fem_nsparse), HYPRE_MEMORY_SHARED); HYPRE_SStructMatrixCreate(hypre_MPI_COMM_WORLD, 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]; } 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); } } } } } else if (data.fem_nvars > 0) { /* FEMStencilSetRow: add to stencil values */ 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.fem_values); } } } } } } /* GraphAddEntries: set non-stencil entries */ for (part = 0; part < data.nparts; part++) { pdata = data.pdata[part]; 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.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_SStructMatrixSetBoxValues(A, part, pdata.matset_ilowers[box], pdata.matset_iuppers[box], pdata.matset_vars[box], 1, &pdata.matset_entries[box], 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_SStructMatrixAddToBoxValues(A, part, pdata.matadd_ilowers[box], pdata.matadd_iuppers[box], pdata.matadd_vars[box], 1, &pdata.matadd_entries[box][entry], 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++; } } 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, values); } } } } } HYPRE_SStructMatrixAssemble(A); /*----------------------------------------------------------- * Set up the linear system *-----------------------------------------------------------*/ HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, 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; } } 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, values); } } } /* Add values for FEMRhsSet */ if (data.fem_rhs_true) { 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.fem_rhs_values); } } } } } } /* 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_SStructVectorAddToBoxValues(b, part, pdata.rhsadd_ilowers[box], pdata.rhsadd_iuppers[box], pdata.rhsadd_vars[box], 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); HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, 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_SStructVectorSetBoxValues(x, part, ilower, iupper, var, values); } } } } HYPRE_SStructVectorAssemble(x); hypre_EndTiming(time_index); hypre_PrintTiming("SStruct Interface", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, 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(hypre_MPI_COMM_WORLD, 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(hypre_MPI_COMM_WORLD, 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]; } 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, 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]); } } } } /* re-initializes x to 0 */ hypre_SStructAxpy(-1.0, b, x); } #endif hypre_TFree(values,HYPRE_MEMORY_SHARED); /*----------------------------------------------------------- * Solve the system using SysPFMG or Split *-----------------------------------------------------------*/ if (solver_id == 3) { time_index = hypre_InitializeTiming("SysPFMG Setup"); hypre_BeginTiming(time_index); HYPRE_SStructSysPFMGCreate(hypre_MPI_COMM_WORLD, &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, 1); HYPRE_SStructSysPFMGSetLogging(solver, 1); HYPRE_SStructSysPFMGSetup(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("SysPFMG Solve"); hypre_BeginTiming(time_index); HYPRE_SStructSysPFMGSolve(solver, A, b, x); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(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, 1 ); HYPRE_PCGSetRecomputeResidual( (HYPRE_Solver) solver, recompute_res); if ((solver_id == 10) || (solver_id == 11)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", 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_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(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, 0 ); if ((solver_id == 10) || (solver_id == 11)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", 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("PCG 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_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 ); free( eigenvalues ); } 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(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", 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("LOBPCG 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) || (solver_id == 11)) { HYPRE_SStructSplitDestroy(precond); } else if (solver_id == 13) { HYPRE_SStructSysPFMGDestroy(precond); } mv_MultiVectorDestroy( eigenvectors ); free( eigenvalues ); } 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(hypre_MPI_COMM_WORLD, &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, 1 ); 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, 1); 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(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", 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); } 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(hypre_MPI_COMM_WORLD, &solver); HYPRE_GMRESSetKDim( (HYPRE_Solver) solver, 5 ); HYPRE_GMRESSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_GMRESSetTol( (HYPRE_Solver) solver, tol ); HYPRE_GMRESSetPrintLevel( (HYPRE_Solver) solver, 1 ); HYPRE_GMRESSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 30) || (solver_id == 31)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(hypre_MPI_COMM_WORLD, &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", 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_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(hypre_MPI_COMM_WORLD, &par_solver); HYPRE_GMRESSetKDim(par_solver, 5); HYPRE_GMRESSetMaxIter(par_solver, 100); HYPRE_GMRESSetTol(par_solver, tol); HYPRE_GMRESSetPrintLevel(par_solver, 1); 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, 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); } else if (solver_id == 41) { /* use Euclid as preconditioner */ HYPRE_EuclidCreate(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", 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); } 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(hypre_MPI_COMM_WORLD, &solver); HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver) solver, 100 ); HYPRE_BiCGSTABSetTol( (HYPRE_Solver) solver, tol ); HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver) solver, 1 ); HYPRE_BiCGSTABSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 50) || (solver_id == 51)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(hypre_MPI_COMM_WORLD, &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", 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_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(hypre_MPI_COMM_WORLD, &par_solver); HYPRE_BiCGSTABSetMaxIter(par_solver, 100); HYPRE_BiCGSTABSetTol(par_solver, tol); HYPRE_BiCGSTABSetPrintLevel(par_solver, 1); 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, 1); 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(hypre_MPI_COMM_WORLD, &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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(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, 1 ); HYPRE_FlexGMRESSetLogging( (HYPRE_Solver) solver, 1 ); if ((solver_id == 70) || (solver_id == 71)) { /* use Split solver as preconditioner */ HYPRE_SStructSplitCreate(hypre_MPI_COMM_WORLD, &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", 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_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(hypre_MPI_COMM_WORLD, &par_solver); HYPRE_FlexGMRESSetKDim(par_solver, 5); HYPRE_FlexGMRESSetMaxIter(par_solver, 100); HYPRE_FlexGMRESSetTol(par_solver, tol); HYPRE_FlexGMRESSetPrintLevel(par_solver, 1); 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, 1); 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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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, 1); 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, 1); 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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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,1); HYPRE_ParCSRHybridSetLogging(par_solver,1); HYPRE_ParCSRHybridSetSolverType(par_solver, solver_type); HYPRE_ParCSRHybridSetRecomputeResidual(par_solver, recompute_res); HYPRE_ParCSRHybridSetup(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("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", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); HYPRE_ParCSRHybridGetNumIterations(par_solver, &num_iterations); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(par_solver, &final_res_norm); HYPRE_ParCSRHybridDestroy(par_solver); } /*----------------------------------------------------------- * Solve the system using Struct solvers *-----------------------------------------------------------*/ if (solver_id == 200) { time_index = hypre_InitializeTiming("SMG Setup"); hypre_BeginTiming(time_index); HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &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, 1); HYPRE_StructSMGSetLogging(struct_solver, 1); HYPRE_StructSMGSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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, 1); HYPRE_StructPFMGSetLogging(struct_solver, 1); HYPRE_StructPFMGSetup(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Setup phase times", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); num_iterations = 1; HYPRE_StructVectorCreate(hypre_MPI_COMM_WORLD, 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(hypre_MPI_COMM_WORLD, &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, 1); HYPRE_StructSparseMSGSetLogging(struct_solver, 1); HYPRE_StructSparseMSGSetup(struct_solver, sA, sb, sx); 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(struct_solver, sA, sb, sx); hypre_EndTiming(time_index); hypre_PrintTiming("Solve phase times", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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, 1 ); HYPRE_PCGSetRecomputeResidual( (HYPRE_Solver)struct_solver, recompute_res); if (solver_id == 210) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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, 1); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &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, 1 ); HYPRE_GMRESSetLogging( (HYPRE_Solver)struct_solver, 1 ); if (solver_id == 230) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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(hypre_MPI_COMM_WORLD, &struct_solver); HYPRE_BiCGSTABSetMaxIter( (HYPRE_Solver)struct_solver, 100 ); HYPRE_BiCGSTABSetTol( (HYPRE_Solver)struct_solver, tol ); HYPRE_BiCGSTABSetPrintLevel( (HYPRE_Solver)struct_solver, 1 ); HYPRE_BiCGSTABSetLogging( (HYPRE_Solver)struct_solver, 1 ); if (solver_id == 240) { /* use symmetric SMG as preconditioner */ HYPRE_StructSMGCreate(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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, 0); 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(hypre_MPI_COMM_WORLD, &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", hypre_MPI_COMM_WORLD); 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", hypre_MPI_COMM_WORLD); 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 */ 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++) { 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, values); 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); } 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"); } /*----------------------------------------------------------- * Verify GetBoxValues() *-----------------------------------------------------------*/ #if 0 { HYPRE_SStructVector xnew; HYPRE_ParVector par_xnew; HYPRE_StructVector sxnew; HYPRE_Real rnorm, bnorm; HYPRE_SStructVectorCreate(hypre_MPI_COMM_WORLD, 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 = sqrt(bnorm); rnorm = 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_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_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); } 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_FinalizeMemoryDebug(); */ /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.18.2/src/test/sstruct.in.README000066400000000000000000000112421355566575400175210ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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 'struct.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.18.2/src/test/sstruct_fac.c000066400000000000000000002436071355566575400172260ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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] = 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] = 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] = 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); /*----------------------------------------------------------- * 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); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.18.2/src/test/struct.c000066400000000000000000004117351355566575400162310ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.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 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_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 print_system = 0; /* 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 */ //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 ); /* Initialize Hypre */ HYPRE_Init(argc, argv); #ifdef HYPRE_DEBUG cegdb(&argc, &argv, myid); #endif /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; skip = 0; sym = 1; rap = 0; relax = 1; 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 = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-convect") == 0 ) { arg_index++; conx = atof(argv[arg_index++]); cony = atof(argv[arg_index++]); conz = 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= 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 = atof(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; } 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 = 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 = 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], "-devicelevel") == 0 ) { arg_index++; device_level = atoi(argv[arg_index++]); } */ /* end lobpcg */ else { arg_index++; } } /* 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("\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) { 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= (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] = sqrt(1.0 / cx); } if (cy > 0) { dxyz[1] = sqrt(1.0 / cy); } if (cz > 0) { dxyz[2] = 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; } A = (HYPRE_StructMatrix) hypre_StructMatrixRead(hypre_MPI_COMM_WORLD, argv[read_fromfile_index],A_num_ghost); b = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index],v_num_ghost); x = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index],v_num_ghost); } /* 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); #if defined(HYPRE_USING_CUDA) HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_DEVICE); /* if (device_level == 0) { HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_HOST); hypre_SetDeviceOff(); } else { HYPRE_Int max_box_size = hypre_StructGridGetMaxBoxSize(grid); if (max_box_size < 0)//HYPRE_MIN_GPU_SIZE) { HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_HOST); hypre_SetDeviceOff(); } else { HYPRE_StructGridSetDataLocation(grid, HYPRE_MEMORY_DEVICE); } } */ #endif /*----------------------------------------------------------- * 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=1 ); if ( diag_rank==0 ) { stencil_entries[diag_rank]=1; } else { stencil_entries[diag_rank]=0; } for ( i=0; i 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]); b = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost); 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]); x = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index],v_num_ghost); 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]); b = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost); x = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost); 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]); A = (HYPRE_StructMatrix) hypre_StructMatrixRead(hypre_MPI_COMM_WORLD, argv[read_fromfile_index], A_num_ghost); 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]); b = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_rhsfromfile_index], v_num_ghost); 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]); x = (HYPRE_StructVector) hypre_StructVectorRead(hypre_MPI_COMM_WORLD, argv[read_x0fromfile_index], v_num_ghost); 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 ) { 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, 1); HYPRE_StructSMGSetLogging(solver, 1); #if defined(HYPRE_USING_CUDA) //HYPRE_StructSMGSetDeviceLevel(solver,device_level); #endif #if defined(HYPRE_USING_CUDA) //hypre_box_print = 0; #endif HYPRE_StructSMGSetup(solver, A, b, x); #if 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, 1); HYPRE_StructPFMGSetLogging(solver, 1); #if 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, 1); 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, 1 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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, 0 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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 ); free( eigenvalues ); } 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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 ); free( eigenvalues ); } 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, 1); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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, 1 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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, 1 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 0); 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, 1 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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, 1 ); 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, 0); HYPRE_StructSMGSetLogging(precond, 0); #if 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, 0); HYPRE_StructPFMGSetLogging(precond, 0); #if 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); } /* Finalize Hypre */ HYPRE_Finalize(); /* Finalize MPI */ hypre_MPI_Finalize(); #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 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 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 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. *-----------------------------------------------------------*/ #define DEVICE_VAR is_device_ptr(values) 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; values[0] = value; values[volume - 1] = -value; } hypre_LoopEnd() } else { hypre_LoopBegin(volume,i) { values[i] = value; } hypre_LoopEnd() } #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructVectorSetBoxValues(zvector, ilower, iupper, values); #if 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 } 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 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 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 #define DEVICE_VAR is_device_ptr(values) if (dim == 1) { hypre_LoopBegin(volume, d) HYPRE_Int i = stencil_size * d; values[i ] = west; values[i + 1] = center; hypre_LoopEnd() } else if (dim == 2) { hypre_LoopBegin(volume, d) HYPRE_Int i = stencil_size * d; values[i ] = west; values[i + 1] = south; values[i + 2] = center; hypre_LoopEnd() } else if (dim == 3) { hypre_LoopBegin(volume, d) HYPRE_Int i = stencil_size * d; values[i ] = west; values[i + 1] = south; values[i + 2] = bottom; values[i + 3] = center; hypre_LoopEnd() } #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); #if 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 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 #define DEVICE_VAR is_device_ptr(values) hypre_LoopBegin(volume,i) { values[i] = center; } hypre_LoopEnd() #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices+dim, values); #if 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 defined(HYPRE_USING_CUDA) if (data_location == HYPRE_MEMORY_DEVICE) { 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 #define DEVICE_VAR is_device_ptr(values) 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() #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, stencil_size, stencil_indices, values); #if 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 ( 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 defined(HYPRE_USING_CUDA) if (data_location == HYPRE_MEMORY_DEVICE) { 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 #define DEVICE_VAR is_device_ptr(values) hypre_LoopBegin(volume,i) { values[i] = center; } hypre_LoopEnd() #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructMatrixSetBoxValues(A, ilower, iupper, 1, stencil_indices, values); #if 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 } } } 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 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 defined(HYPRE_USING_CUDA) if (data_location == HYPRE_MEMORY_DEVICE) { 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 /* RL: if used CTAlloc, then don't need to set 0.0 */ #define DEVICE_VAR is_device_ptr(values) hypre_LoopBegin(vol[ib],i) { values[i] = 0.0; } hypre_LoopEnd() #undef DEVICE_VAR 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 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 } } } 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.18.2/src/test/struct_migrate.c000066400000000000000000000335501355566575400177340ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 ; 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 ); /* Initialize Hypre */ HYPRE_Init(argc, argv); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; nx = 2; ny = 2; nz = 2; P = num_procs; Q = 1; 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); /* 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 ierr = 0; hypre_BoxArray *gridboxes; HYPRE_Int ib; hypre_IndexRef ilower; hypre_IndexRef iupper; hypre_Box *box; HYPRE_Real *values; HYPRE_Int volume; 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, HYPRE_MEMORY_DEVICE); #define DEVICE_VAR is_device_ptr(values) hypre_LoopBegin(volume,i) { values[i] = value; } hypre_LoopEnd(); #undef DEVICE_VAR ilower = hypre_BoxIMin(box); iupper = hypre_BoxIMax(box); HYPRE_StructVectorSetBoxValues(vector, ilower, iupper, values); hypre_TFree(values, HYPRE_MEMORY_DEVICE); } return ierr; } hypre-2.18.2/src/test/struct_newboxloop.c000066400000000000000000001460171355566575400205030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.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 = atof(argv[arg_index++]); cy = atof(argv[arg_index++]); cz = atof(argv[arg_index++]); } else if ( strcmp(argv[arg_index], "-convect") == 0 ) { arg_index++; conx = atof(argv[arg_index++]); cony = atof(argv[arg_index++]); conz = 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=1 ); if ( diag_rank==0 ) stencil_entries[diag_rank]=1; else stencil_entries[diag_rank]=0; for ( i=0; i 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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.18.2/src/test/test_ij.c000066400000000000000000005046421355566575400163460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.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 = 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 = 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]\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./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 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 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 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_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 ); free( eigenvalues ); 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 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 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 ); free( eigenvalues ); } /* 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 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 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 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 = 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\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 = 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\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.18.2/src/test/zboxloop.c000066400000000000000000000314631355566575400165550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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" /*-------------------------------------------------------------------------- * Test driver to time new boxloops and compare to the old ones *--------------------------------------------------------------------------*/ #define DEVICE_VAR 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_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 ); /*----------------------------------------------------------- * Set defaults *-----------------------------------------------------------*/ dim = 3; nx = 10; ny = 10; nz = 10; P = num_procs; Q = 1; R = 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], "-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); 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); zypre_BoxLoop1For(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 += xp1[xi1]; if (xp1[xi1] != 1) { hypre_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 old boxloops *-----------------------------------------------------------*/ /* Time BoxLoop0 */ time_index = hypre_InitializeTiming("BoxLoop0"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { xi1 = 0; hypre_BoxLoop0Begin(3, loop_size); { xp1[xi1] += xp1[xi1]; //xi1++; } hypre_BoxLoop0End(); } hypre_EndTiming(time_index); /* Time BoxLoop1 */ time_index = hypre_InitializeTiming("BoxLoop1"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { hypre_BoxLoop1Begin(3, loop_size, x1_data_box, start, unit_stride, xi1); { xp1[xi1] += xp1[xi1]; } hypre_BoxLoop1End(xi1); } hypre_EndTiming(time_index); /* Time BoxLoop2 */ time_index = hypre_InitializeTiming("BoxLoop2"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { hypre_BoxLoop2Begin(3, loop_size, x1_data_box, start, unit_stride, xi1, x2_data_box, start, unit_stride, xi2); { xp1[xi1] += xp1[xi1] + xp2[xi2]; } hypre_BoxLoop2End(xi1, xi2); } hypre_EndTiming(time_index); /* Time BoxLoop3 */ time_index = hypre_InitializeTiming("BoxLoop3"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { 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); { xp1[xi1] += xp1[xi1] + xp2[xi2] + xp3[xi3]; } hypre_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++) { 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); { xp1[xi1] += xp1[xi1] + xp2[xi2] + xp3[xi3] + xp4[xi4]; } hypre_BoxLoop4End(xi1, xi2, xi3, xi4); } hypre_EndTiming(time_index); hypre_PrintTiming("Old BoxLoop times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * Time new boxloops *-----------------------------------------------------------*/ /* Time BoxLoop0 */ time_index = hypre_InitializeTiming("BoxLoop0"); hypre_BeginTiming(time_index); for (rep = 0; rep < reps; rep++) { xi1 = 0; zypre_BoxLoop0Begin(dim, loop_size); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ZYPRE_BOX_PRIVATE) firstprivate(xi1) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop0For() { 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ZYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop1For(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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ZYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop2For(xi1, 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ZYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop3For(xi1, xi2, 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); #ifdef HYPRE_USING_OPENMP #pragma omp parallel for private(ZYPRE_BOX_PRIVATE) HYPRE_SMP_SCHEDULE #endif zypre_BoxLoop4For(xi1, xi2, xi3, xi4) { xp1[xi1] += xp1[xi1] + xp2[xi2] + xp3[xi3] + xp4[xi4]; } zypre_BoxLoop4End(xi1, xi2, xi3, xi4); } hypre_EndTiming(time_index); hypre_PrintTiming("New BoxLoop times", hypre_MPI_COMM_WORLD); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); /*----------------------------------------------------------- * 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); /* Finalize MPI */ hypre_MPI_Finalize(); return (0); } hypre-2.18.2/src/utilities/000077500000000000000000000000001355566575400155625ustar00rootroot00000000000000hypre-2.18.2/src/utilities/CMakeLists.txt000066400000000000000000000016211355566575400203220ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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_hopscotch_hash.h HYPRE_error_f.h fortran.h fortran_matrix.h ) set(SRCS HYPRE_version.c amg_linklist.c binsearch.c exchange_data.c F90_HYPRE_error.c fortran_matrix.c hypre_ap.c hypre_complex.c hypre_error.c hypre_general.c hypre_hopscotch_hash.c hypre_memory.c hypre_merge_sort.c hypre_mpi_comm_f2c.c hypre_prefix_sum.c hypre_printf.c hypre_qsort.c mpistubs.c qsplit.c random.c threading.c timer.c timing.c ) convert_filenames_to_full_paths(HDRS) convert_filenames_to_full_paths(SRCS) set(HYPRE_HEADERS ${HYPRE_HEADERS} ${HDRS} PARENT_SCOPE) set(HYPRE_SOURCES ${HYPRE_SOURCES} ${SRCS} PARENT_SCOPE) hypre-2.18.2/src/utilities/F90_HYPRE_error.c000066400000000000000000000025461355566575400204530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/utilities/HYPRE_error_f.h000066400000000000000000000012251355566575400203400ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/HYPRE_utilities.h000066400000000000000000000124041355566575400207160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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_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 #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 #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 #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) typedef double _Complex HYPRE_Complex; #define HYPRE_MPI_COMPLEX MPI_C_DOUBLE_COMPLEX /* or MPI_LONG_DOUBLE ? */ #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 */ /*-------------------------------------------------------------------------- * HYPRE error user functions *--------------------------------------------------------------------------*/ /* Return the current hypre error flag */ HYPRE_Int HYPRE_GetError(); /* 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(); /* 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(); /* Clears the given error code from the hypre error flag */ HYPRE_Int HYPRE_ClearError(HYPRE_Int hypre_error_code); /*-------------------------------------------------------------------------- * 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 */ HYPRE_Int HYPRE_AssumedPartitionCheck(); #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/utilities/HYPRE_version.c000066400000000000000000000044611355566575400203670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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]; /* Compute a single, unique, sortable number representation of the release. * This assumes 2 digits for each subnumber, so 2.14.0 becomes 21400. */ single = major*10000 + minor*100 + patch; 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.18.2/src/utilities/Makefile000066400000000000000000000044761355566575400172350ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore National 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)\ ${CINCLUDES}\ ${CDEFS} CXX_COMPILE_FLAGS = ${C_COMPILE_FLAGS} HEADERS =\ amg_linklist.h\ exchange_data.h\ fortran.h\ fortran_matrix.h\ hypre_general.h\ hypre_memory.h\ HYPRE_utilities.h\ mpistubs.h\ threading.h\ timing.h\ _hypre_utilities.h FILES =\ F90_HYPRE_error.c\ HYPRE_version.c\ amg_linklist.c\ binsearch.c\ exchange_data.c\ fortran_matrix.c\ hypre_ap.c\ hypre_complex.c\ hypre_cuda_utils.c\ hypre_error.c\ hypre_general.c\ hypre_hopscotch_hash.c\ hypre_memory.c\ hypre_merge_sort.c\ hypre_mpi_comm_f2c.c\ hypre_omp_device.c\ hypre_prefix_sum.c\ hypre_printf.c\ hypre_qsort.c\ mpistubs.c\ qsplit.c\ random.c\ threading.c\ timer.c\ timing.c OBJS = ${FILES:.c=.o} 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_utilities.h $(HYPRE_BUILD_DIR)/include cp -fR $(srcdir)/hypre_hopscotch_hash.h $(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 libHYPRE* rm -rf pchdir tca.map *inslog* distclean: clean ################################################################## # Rules ################################################################## libHYPRE_utilities.a: ${OBJS} @echo "Building $@ ... " ${AR} $@ *.o ${RANLIB} $@ libHYPRE_utilities.so libHYPRE_utilities.dylib: ${OBJS} @echo "Building $@ ... " ${BUILD_CC_SHARED} -o ${SONAME} ${OBJS} ${SHARED_SET_SONAME}${SONAME} ln -s ${SONAME} $@ ${OBJS}: ${HEADERS} hypre-2.18.2/src/utilities/_hypre_utilities.h000066400000000000000000002600211355566575400213150ustar00rootroot00000000000000 /*** 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 1998-2019 Lawrence Livermore 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 /* 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; /* This allows us to consistently avoid 'double' throughout hypre */ typedef double hypre_double; /*-------------------------------------------------------------------------- * 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 #endif /* hypre_GENERAL_HEADER */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_INT #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE #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_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) (); 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_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_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_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_CUDA) || 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 * * Questions: * * 1. prefetch? * *****************************************************************************/ #ifndef hypre_MEMORY_HEADER #define hypre_MEMORY_HEADER #include #include /* 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 #define HYPRE_MEMORY_UNSET (-1) #define HYPRE_MEMORY_DEVICE ( 0) #define HYPRE_MEMORY_HOST ( 1) #define HYPRE_MEMORY_SHARED ( 2) #define HYPRE_MEMORY_HOST_PINNED ( 3) #define HYPRE_EXEC_UNSET (-1) #define HYPRE_EXEC_DEVICE ( 0) #define HYPRE_EXEC_HOST ( 1) /*================================================================== * default def of memory location selected based memory env * +-------------------------------------------------------------+ * | | HYPRE_MEMORY_* | * | MEM \ LOC | HOST | DEVICE | SHARED | PINNED | * |---------------------------+---------------+-----------------| * | HYPRE_USING_HOST_MEMORY | HOST | HOST | HOST | HOST | * |---------------------------+---------------+-------- --------| * | HYPRE_USING_DEVICE_MEMORY | HOST | DEVICE | DEVICE | PINNED | * |---------------------------+---------------+-----------------| * | HYPRE_USING_UNIFIED_MEMORY| HOST | DEVICE | SHARED | PINNED | * +-------------------------------------------------------------+ *==================================================================*/ #if defined(HYPRE_USING_HOST_MEMORY) /* default memory model without device (host only) */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST #elif defined(HYPRE_USING_DEVICE_MEMORY) /* default memory model with device and without unified memory */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST_PINNED #elif defined(HYPRE_USING_UNIFIED_MEMORY) /* default memory model with device and with unified memory */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_SHARED //#define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST_PINNED #else /* default */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST #endif /* the above definitions might be overridden to customize * memory locations */ /* #undef HYPRE_MEMORY_HOST_ACT */ /* #undef HYPRE_MEMORY_DEVICE_ACT */ /* #undef HYPRE_MEMORY_SHARED_ACT */ /* #undef HYPRE_MEMORY_PINNED_ACT */ /* #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_PINNED_ACT HYPRE_MEMORY_? */ /*------------------------------------------------------- * hypre_GetActualMemLocation * return actual location based on the selected memory model *-------------------------------------------------------*/ static inline HYPRE_Int hypre_GetActualMemLocation(HYPRE_Int location) { if (location == HYPRE_MEMORY_HOST) { return HYPRE_MEMORY_HOST_ACT; } if (location == HYPRE_MEMORY_DEVICE) { return HYPRE_MEMORY_DEVICE_ACT; } if (location == HYPRE_MEMORY_SHARED) { return HYPRE_MEMORY_SHARED_ACT; } if (location == HYPRE_MEMORY_HOST_PINNED) { return HYPRE_MEMORY_HOST_PINNED_ACT; } return HYPRE_MEMORY_UNSET; } #define HYPRE_MEM_PAD_LEN 1 #if 0 /* These Allocs are with printfs, for debug */ #define hypre_TAlloc(type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] TALLOC %.3f MB\n", __FILE__,__LINE__, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *) hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ }\ ) #define hypre_CTAlloc(type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] CTALLOC %.3f MB\n", __FILE__,__LINE__, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *) hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location); \ }\ ) #define hypre_TReAlloc(ptr, type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] TReALLOC %p, %.3f MB\n", __FILE__,__LINE__, ptr, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *)hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location); \ }\ ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ ( \ { \ printf("[%s:%d] TMemcpy %d to %d %.3f MB\n", __FILE__,__LINE__, locsrc, locdst, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc); \ } \ ) #else #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_TMemcpy(dst, src, type, count, locdst, locsrc) \ (hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc)) #endif #define hypre_TFree(ptr, location) \ ( hypre_Free((void *)ptr, location), ptr = NULL ) /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* hypre_memory.c */ void * hypre_MAlloc(size_t size, HYPRE_Int location); void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_Int location); void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_Int location); void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_Int loc_dst, HYPRE_Int loc_src); void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_Int location); void hypre_Free(void *ptr, HYPRE_Int location); HYPRE_Int hypre_GetMemoryLocation(const void *ptr, HYPRE_Int *memory_location); /* 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 /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_omp45_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(); HYPRE_Int HYPRE_OMPOffloadOff(); HYPRE_Int HYPRE_OMPOffloadStatPrint(); #define HYPRE_MIN_GPU_SIZE (131072) #define hypre_SetDeviceOn() HYPRE_OMPOffloadOn() #define hypre_SetDeviceOff() HYPRE_OMPOffloadOff() #endif /* HYPRE_USING_DEVICE_OPENMP */ #endif /* HYPRE_OMP_DEVICE_H */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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_IncFLOPCount(inc) #define hypre_BeginTiming(i) #define hypre_EndTiming(i) #define hypre_PrintTiming(heading, comm) #define hypre_ClearTiming() /*-------------------------------------------------------------------------- * 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_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 ); #endif #ifdef __cplusplus } #endif #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- * Global variable used in hypre error checking *--------------------------------------------------------------------------*/ extern HYPRE_Int hypre__global_error; #define hypre_error_flag hypre__global_error /*-------------------------------------------------------------------------- * HYPRE error macros *--------------------------------------------------------------------------*/ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg); #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) #ifdef NDEBUG #define hypre_assert(EX) #else #define hypre_assert(EX) if (!(EX)) {hypre_fprintf(stderr,"hypre_assert failed: %s\n", #EX); hypre_error(1);} #endif #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include #define HYPRE_ANNOTATION_BEGIN( str ) cali_begin_string_byname("hypre.kernel", str) #define HYPRE_ANNOTATION_END( str ) cali_end_byname("hypre.kernel") #else #define HYPRE_ANNOTATION_BEGIN( str ) #define HYPRE_ANNOTATION_END( str ) #endif #endif /* CALIPER_INSTRUMENTATION_HEADER */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_CUDA_UTILS_H #define HYPRE_CUDA_UTILS_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_printf( const char *format , ... ); #ifdef __cplusplus extern "C++" { #endif #include #include #include #include #include #include #ifndef CUDART_VERSION #error CUDART_VERSION Undefined! #endif #ifndef CUDA_VERSION #error CUDA_VERSION Undefined! #endif #if defined(HYPRE_USING_CUDA) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace thrust::placeholders; #endif // #if defined(HYPRE_USING_CUDA) #define HYPRE_WARP_SIZE 32 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFF #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 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macro for launching CUDA kernels, CUDA, Thrust, Cusparse, Curand calls * NOTE: IN HYPRE'S DEFAULT STREAM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define HYPRE_CUDA_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize.x == 0 || gridsize.y == 0 || gridsize.z == 0 || \ blocksize.x == 0 || blocksize.y == 0 || blocksize.z == 0 ) \ { \ /* hypre_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 \ { \ (kernel_name) <<< (gridsize), (blocksize), 0, hypre_HandleCudaComputeStream(hypre_handle) >>> (__VA_ARGS__); \ } \ } #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name( \ thrust::cuda::par.on(hypre_HandleCudaComputeStream(hypre_handle)), __VA_ARGS__); \ #define HYPRE_CUBLAS_CALL(call) do { \ cublasStatus_t err = call; \ if (CUBLAS_STATUS_SUCCESS != err) { \ hypre_printf("CUBLAS ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUBLAS_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ hypre_printf("CUSPARSE ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUSPARSE_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CURAND_CALL(call) do { \ curandStatus_t err = call; \ if (CURAND_STATUS_SUCCESS != err) { \ hypre_printf("CURAND ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CUDA_CALL(call) do { \ cudaError_t err = call; \ if (cudaSuccess != err) { \ hypre_printf("CUDA ERROR (code = %d, %s) at %s:%d\n", err, cudaGetErrorString(err), __FILE__, __LINE__); \ exit(1); \ } } while(0) #if defined(HYPRE_USING_CUDA) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_num_threads() { 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_cuda_get_thread_id() { 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_cuda_get_num_warps() { return hypre_cuda_get_num_threads() >> 5; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_warp_id() { return hypre_cuda_get_thread_id() >> 5; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_lane_id() { return hypre_cuda_get_thread_id() & (HYPRE_WARP_SIZE-1); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_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_cuda_get_block_id() { 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_cuda_get_grid_num_threads() { return hypre_cuda_get_num_blocks() * hypre_cuda_get_num_threads(); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_thread_id() { return hypre_cuda_get_block_id() * hypre_cuda_get_num_threads() + hypre_cuda_get_thread_id(); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_num_warps() { return hypre_cuda_get_num_blocks() * hypre_cuda_get_num_warps(); } /* return the flattened warp id in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_warp_id() { return hypre_cuda_get_block_id() * hypre_cuda_get_num_warps() + hypre_cuda_get_warp_id(); } #if CUDA_VERSION < 9000 template static __device__ __forceinline__ T __shfl_sync(unsigned mask, T val, hypre_int src_line, hypre_int width=32) { return __shfl(val, src_line, width); } template static __device__ __forceinline__ T __shfl_down_sync(unsigned mask, T val, unsigned delta, hypre_int width=32) { return __shfl_down(val, delta, width); } template static __device__ __forceinline__ T __shfl_xor_sync(unsigned mask, T val, unsigned lanemask, hypre_int width=32) { return __shfl_xor(val, lanemask, width); } template static __device__ __forceinline__ T __shfl_up_sync(unsigned mask, T val, unsigned delta, hypre_int width=32) { return __shfl_up(val, delta, width); } static __device__ __forceinline__ void __syncwarp() { } #endif template static __device__ __forceinline__ T read_only_load( const T *ptr ) { return __ldg( ptr ); } template static __device__ __forceinline__ T warp_prefix_sum(hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= 32; 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, 31); if (lane_id == 31) { in = 0; } #pragma unroll for (hypre_int d = 16; 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; } template static __device__ __forceinline__ T warp_reduce_sum(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in += __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_allreduce_sum(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in += __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_reduce_max(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in = min(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } 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; } template struct absolute_value : public thrust::unary_function { __host__ __device__ T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp1 { 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 thrust::get<1>(t1) < thrust::get<1>(t2); } }; 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)); } }; #endif // #if defined(HYPRE_USING_CUDA) #ifdef __cplusplus } #endif struct is_negative { __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < 0); } }; struct is_nonnegative { __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x >= 0); } }; struct in_range { HYPRE_Int low, up; in_range(HYPRE_Int low_, HYPRE_Int up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x >= low && x <= up); } }; struct out_of_range { HYPRE_Int low, up; out_of_range(HYPRE_Int low_, HYPRE_Int up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < low || x > up); } }; struct less_than { HYPRE_Int val; less_than(HYPRE_Int val_) { val = val_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < val); } }; #if defined(HYPRE_USING_CUDA) /* for struct solvers */ #define HYPRE_MIN_GPU_SIZE (131072) extern HYPRE_Int hypre_exec_policy; #define hypre_SetDeviceOn() hypre_exec_policy = HYPRE_MEMORY_DEVICE #define hypre_SetDeviceOff() hypre_exec_policy = HYPRE_MEMORY_HOST #endif #endif /* HYPRE_USING_CUDA */ #endif /* #ifndef HYPRE_CUDA_UTILS_H */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #ifdef __cplusplus extern "C++" { #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) #include #endif typedef struct { HYPRE_Int hypre_error; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int default_exec_policy; HYPRE_Int cuda_device; /* by default, hypre puts GPU computations in this stream * Do not be confused with the default (null) CUDA stream */ HYPRE_Int cuda_compute_stream_num; HYPRE_Int cuda_prefetch_stream_num; HYPRE_Int cuda_compute_stream_sync_default; std::vector cuda_compute_stream_sync; curandGenerator_t curand_gen; cublasHandle_t cublas_handle; cusparseHandle_t cusparse_handle; cusparseMatDescr_t cusparse_mat_descr; cudaStream_t cuda_streams[HYPRE_MAX_NUM_STREAMS]; /* work space for hypre's CUDA reducer */ void* cuda_reduce_buffer; /* device spgemm options */ HYPRE_Int spgemm_use_cusparse; HYPRE_Int spgemm_num_passes; HYPRE_Int spgemm_rownnz_estimate_method; HYPRE_Int spgemm_rownnz_estimate_nsamples; float spgemm_rownnz_estimate_mult_factor; char spgemm_hash_type; #endif } hypre_Handle; extern hypre_Handle *hypre_handle; hypre_Handle* hypre_HandleCreate(); HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_); /* accessor inline function to hypre_device_csr_handle */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) static inline HYPRE_Int & hypre_HandleDefaultExecPolicy(hypre_Handle *hypre_handle_) { return hypre_handle_->default_exec_policy; } static inline HYPRE_Int & hypre_HandleCudaDevice(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_device; } static inline HYPRE_Int & hypre_HandleCudaComputeStreamNum(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_num; } static inline HYPRE_Int & hypre_HandleCudaPrefetchStreamNum(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_prefetch_stream_num; } static inline HYPRE_Int & hypre_HandleCudaComputeStreamSyncDefault(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_sync_default; } static inline std::vector & hypre_HandleCudaComputeStreamSync(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_sync; } static inline cudaStream_t hypre_HandleCudaStream(hypre_Handle *hypre_handle_, HYPRE_Int i) { cudaStream_t stream = 0; #if defined(HYPRE_USING_CUDA_STREAMS) if (i >= HYPRE_MAX_NUM_STREAMS) { /* return the default stream, i.e., the NULL stream */ /* hypre_printf("CUDA stream %d exceeds the max number %d\n", i, HYPRE_MAX_NUM_STREAMS); */ return NULL; } if (hypre_handle_->cuda_streams[i]) { return hypre_handle_->cuda_streams[i]; } //HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream,cudaStreamNonBlocking)); HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream, cudaStreamDefault)); hypre_handle_->cuda_streams[i] = stream; #endif return stream; } static inline cudaStream_t hypre_HandleCudaComputeStream(hypre_Handle *hypre_handle_) { return hypre_HandleCudaStream(hypre_handle_, hypre_HandleCudaComputeStreamNum(hypre_handle_)); } static inline cudaStream_t hypre_HandleCudaPrefetchStream(hypre_Handle *hypre_handle_) { return hypre_HandleCudaStream(hypre_handle_, hypre_HandleCudaPrefetchStreamNum(hypre_handle_)); } static inline curandGenerator_t hypre_HandleCurandGenerator(hypre_Handle *hypre_handle_) { if (hypre_handle_->curand_gen) { return hypre_handle_->curand_gen; } curandGenerator_t gen; HYPRE_CURAND_CALL( curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT) ); HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, 1234ULL) ); HYPRE_CURAND_CALL( curandSetStream(gen, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->curand_gen = gen; return gen; } static inline cublasHandle_t hypre_HandleCublasHandle(hypre_Handle *hypre_handle_) { if (hypre_handle_->cublas_handle) { return hypre_handle_->cublas_handle; } cublasHandle_t handle; HYPRE_CUBLAS_CALL( cublasCreate(&handle) ); HYPRE_CUBLAS_CALL( cublasSetStream(handle, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->cublas_handle = handle; return handle; } static inline cusparseHandle_t hypre_HandleCusparseHandle(hypre_Handle *hypre_handle_) { if (hypre_handle_->cusparse_handle) { return hypre_handle_->cusparse_handle; } cusparseHandle_t handle; HYPRE_CUSPARSE_CALL( cusparseCreate(&handle) ); HYPRE_CUSPARSE_CALL( cusparseSetStream(handle, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->cusparse_handle = handle; return handle; } static inline cusparseMatDescr_t hypre_HandleCusparseMatDescr(hypre_Handle *hypre_handle_) { if (hypre_handle_->cusparse_mat_descr) { return hypre_handle_->cusparse_mat_descr; } 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_handle_->cusparse_mat_descr = mat_descr; return mat_descr; } #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) */ static inline void hypre_HandleCudaComputeStreamSyncPush(hypre_Handle *hypre_handle_, HYPRE_Int sync) { #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_UNIFIED_MEMORY) hypre_HandleCudaComputeStreamSync(hypre_handle_).push_back(sync); #endif } static inline void hypre_HandleCudaComputeStreamSyncPop(hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_UNIFIED_MEMORY) hypre_HandleCudaComputeStreamSync(hypre_handle_).pop_back(); #endif } /* synchronize the default stream */ static inline HYPRE_Int hypre_SyncCudaComputeStream(hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_UNIFIED_MEMORY) #if defined(HYPRE_USING_CUDA) assert(!hypre_HandleCudaComputeStreamSync(hypre_handle_).empty()); if ( hypre_HandleCudaComputeStreamSync(hypre_handle_).back() ) { HYPRE_CUDA_CALL( cudaStreamSynchronize(hypre_HandleCudaComputeStream(hypre_handle_)) ); } #endif #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); #endif #endif /* #if defined(HYPRE_USING_UNIFIED_MEMORY) */ return hypre_error_flag; } #ifdef __cplusplus } #endif #endif /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NVTX_H #define HYPRE_NVTX_H #ifdef HYPRE_USING_NVTX #include "nvToolsExt.h" #include "nvToolsExtCudaRt.h" static const uint32_t colors[] = { 0x0000ff00, 0x000000ff, 0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x00ff0000, 0x00ffffff }; static const hypre_int num_colors = sizeof(colors)/sizeof(uint32_t); #define PUSH_RANGE(name,cid) { \ hypre_int color_id = cid; \ color_id = color_id%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); \ } #define POP_RANGE nvtxRangePop(); #else /* HYPRE_USING_NVTX */ #define PUSH_RANGE(name,cid) #define POP_RANGE #endif /* HYPRE_USING_NVTX */ #endif /* HYPRE_NVTX_H */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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) #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #ifdef __cplusplus extern "C++" { #endif 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ //static __shared__ T shared[32]; // Shared mem for 32 partial sums __shared__ T shared[32]; // Shared mem for 32 partial sums //HYPRE_Int lane = threadIdx.x % warpSize; //HYPRE_Int wid = threadIdx.x / warpSize; HYPRE_Int lane = threadIdx.x & (warpSize - 1); HYPRE_Int wid = threadIdx.x >> 5; val = warpReduceSum(val); // Each warp performs partial reduction if (lane == 0) { shared[wid] = val; // Write reduced value to shared memory } __syncthreads(); // Wait for all partial reductions //read from shared memory only if that warp existed if (threadIdx.x < blockDim.x / warpSize) { val = shared[lane]; } else { val = 0.0; } if (wid == 0) { val = warpReduceSum(val); //Final reduce within first warp } #endif return val; } template __global__ void OneBlockReduceKernel(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 { 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; if (hypre_handle->cuda_reduce_buffer == NULL) { /* allocate for the max size for reducing double6 type */ hypre_handle->cuda_reduce_buffer = hypre_TAlloc(HYPRE_double6, 1024, HYPRE_MEMORY_DEVICE); } d_buf = (T*) hypre_handle->cuda_reduce_buffer; } /* copy constructor */ __host__ __device__ ReduceSum(const ReduceSum& other) { *this = other; } /* reduction within blocks */ __host__ __device__ void BlockReduce() const { #ifdef __CUDA_ARCH__ __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; /* 2nd reduction with only *one* block */ assert(nblocks >= 0 && nblocks <= 1024); const dim3 gDim(1), bDim(1024); HYPRE_CUDA_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() { } }; #ifdef __cplusplus } #endif #endif /* #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) */ #endif /* #if defined(HYPRE_USING_CUDA) */ #endif /* #ifndef HYPRE_CUDA_REDUCER_H */ /****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 ); /* hypre_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 ); #else #define hypre_conj(value) value #define hypre_cabs(value) fabs(value) #define hypre_creal(value) value #define hypre_cimag(value) 0.0 #endif /* hypre_general.c */ HYPRE_Int HYPRE_Init( hypre_int argc, char *argv[] ); HYPRE_Int HYPRE_Finalize(); HYPRE_Int hypre_GetDevice(hypre_Handle *hypre_handle); HYPRE_Int hypre_SetDevice(HYPRE_Int use_device, hypre_Handle *hypre_handle); HYPRE_Int hypre_SyncCudaDefaultStream(hypre_Handle *hypre_handle); void hypre_SetExecPolicy( HYPRE_Int policy ); HYPRE_Int hypre_GetExecPolicy1(HYPRE_Int location); HYPRE_Int hypre_GetExecPolicy2(HYPRE_Int location1, HYPRE_Int location2); /* hypre_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_scanf( const char *format , ... ); HYPRE_Int hypre_fscanf( FILE *stream , const char *format, ... ); HYPRE_Int hypre_sscanf( char *s , 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 /* hypre_qsort.c */ void hypre_swap ( HYPRE_Int *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_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_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_qsort2 ( HYPRE_Int *v , HYPRE_Real *w , HYPRE_Int left , HYPRE_Int right ); void hypre_qsort2abs( 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_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 ); /* hypre_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); /* hypre_merge_sort.c */ /** * Why merge sort? * 1) Merge sort can take advantage of eliminating duplicates. * 2) Merge sort is more efficiently parallelizable than qsort */ /** * Out of place merge sort with duplicate elimination * @ret number of unique elements */ HYPRE_Int hypre_merge_sort_unique(HYPRE_Int *in, HYPRE_Int *out, HYPRE_Int len); /** * Out of place merge sort with duplicate elimination * * @param out pointer to output can be in or temp * @ret number of unique elements */ HYPRE_Int hypre_merge_sort_unique2(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **out); void hypre_merge_sort(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **sorted); 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_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_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; /** * 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); #ifdef HYPRE_CONCURRENT_HOPSCOTCH void hypre_big_merge_sort(HYPRE_BigInt *in, HYPRE_BigInt *temp, HYPRE_Int len, HYPRE_BigInt **sorted); void hypre_big_sort_and_create_inverse_map(HYPRE_BigInt *in, HYPRE_Int len, HYPRE_BigInt **out, hypre_UnorderedBigIntMap *inverse_map); #endif /* hypre_cuda_utils.c */ #if defined(HYPRE_USING_CUDA) #ifdef __cplusplus extern "C++" { #endif dim3 hypre_GetDefaultCUDABlockDimension(); dim3 hypre_GetDefaultCUDAGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt); #ifdef __cplusplus } #endif 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_Int first_col, HYPRE_Int *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_Int hypreDevice_IntegerInclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypreDevice_IntegerExclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); 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 *d_row_ptr, HYPRE_Int *d_row_ind); HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum(HYPRE_Int nrows, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_num, 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_GenScatterAdd(HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y); HYPRE_Int hypreDevice_ScatterConstant(HYPRE_Int *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Int v); HYPRE_Int hypreDevice_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_DiagScaleVector(HYPRE_Int n, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_BigToSmallCopy(HYPRE_Int *tgt, const HYPRE_BigInt *src, HYPRE_Int size); void hypre_CudaCompileFlagCheck(); #endif #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/utilities/amg_linklist.c000066400000000000000000000172201355566575400204050ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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. Use the 'free()' * system call to return it to the free 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.18.2/src/utilities/amg_linklist.h000066400000000000000000000020611355566575400204070ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/binsearch.c000066400000000000000000000077251355566575400176770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/utilities/caliper_instrumentation.h000066400000000000000000000020071355566575400226740ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #include #define HYPRE_ANNOTATION_BEGIN( str ) cali_begin_string_byname("hypre.kernel", str) #define HYPRE_ANNOTATION_END( str ) cali_end_byname("hypre.kernel") #else #define HYPRE_ANNOTATION_BEGIN( str ) #define HYPRE_ANNOTATION_END( str ) #endif #endif /* CALIPER_INSTRUMENTATION_HEADER */ hypre-2.18.2/src/utilities/exchange_data.README000066400000000000000000000153171355566575400212230ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/exchange_data.c000066400000000000000000000537631355566575400205170ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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) { HYPRE_Int i, proc, size=0; HYPRE_Int *tmp_child_id; HYPRE_Int num=0, parent = 0; /* 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; return hypre_error_flag; } /*--------------------------------------------------- * hypre_DestroyBinaryTree() * Destroy storage created by createBinaryTree *----------------------------------------------------*/ HYPRE_Int hypre_DestroyBinaryTree(hypre_BinaryTree *tree) { hypre_TFree(hypre_BinaryTreeChildIds(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; hypre_MPI_Request *response_requests, *contact_requests; hypre_MPI_Status *response_statuses, *contact_statuses; 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, term_request1, request_parent; hypre_MPI_Status *term_statuses, 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 = 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_MAlloc(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_Free((char*)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_Free((char*)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_Free((char*)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.18.2/src/utilities/exchange_data.h000066400000000000000000000047151355566575400205150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/fortran.h000066400000000000000000000133641355566575400174150ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_BigInt hypre_F90_BigIntArray; 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_PassBigInt(arg) ((HYPRE_BigInt) *arg) #define hypre_F90_PassBigIntRef(arg) ((HYPRE_BigInt *) arg) #define hypre_F90_PassBigIntArray(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.18.2/src/utilities/fortran_matrix.c000066400000000000000000000342601355566575400207720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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 "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_longint h, hypre_longint w, utilities_FortranMatrix* mtx ) { hypre_assert( h > 0 && w > 0 ); hypre_assert( mtx != NULL ); if ( mtx->value != NULL && mtx->ownsValues ) free( mtx->value ); 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_longint gh, hypre_longint h, hypre_longint w, utilities_FortranMatrix* mtx ) { hypre_assert( h > 0 && w > 0 ); hypre_assert( mtx != NULL ); if ( mtx->value != NULL && mtx->ownsValues ) free( mtx->value ); 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 ) free(mtx->value); free(mtx); } hypre_longint utilities_FortranMatrixGlobalHeight( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->globalHeight; } hypre_longint utilities_FortranMatrixHeight( utilities_FortranMatrix* mtx ) { hypre_assert( mtx != NULL ); return mtx->height; } hypre_longint 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_longint 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_longint 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_longint 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_longint 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_longint 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_longint i, j, h, w; hypre_longint 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_longint i, j, h, w; hypre_longint 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_longint 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_longint 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_longint 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_longint 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_longint 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_longint h, w; hypre_longint i, j, k, l; hypre_longint iA, kA; hypre_longint kB, jB; hypre_longint 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_longint 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 = sqrt(norm); return norm; } HYPRE_Real utilities_FortranMatrixValue( utilities_FortranMatrix* mtx, hypre_longint i, hypre_longint j ) { hypre_longint 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_longint i, hypre_longint j ) { hypre_longint 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_longint i, j, jump; hypre_longint 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_longint iFrom, hypre_longint iTo, hypre_longint jFrom, hypre_longint jTo, utilities_FortranMatrix* block ) { if ( block->value != NULL && block->ownsValues ) free( block->value ); 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_longint i, j, k; hypre_longint 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); } } free( diag ); } HYPRE_Int utilities_FortranMatrixPrint( utilities_FortranMatrix* mtx, const char *fileName) { hypre_longint 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.18.2/src/utilities/fortran_matrix.h000066400000000000000000000070261355566575400207770ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_longint globalHeight; hypre_longint height; hypre_longint width; HYPRE_Real* value; HYPRE_Int ownsValues; } utilities_FortranMatrix; #ifdef __cplusplus extern "C" { #endif utilities_FortranMatrix* utilities_FortranMatrixCreate(void); void utilities_FortranMatrixAllocateData( hypre_longint h, hypre_longint w, utilities_FortranMatrix* mtx ); void utilities_FortranMatrixWrap( HYPRE_Real*, hypre_longint gh, hypre_longint h, hypre_longint w, utilities_FortranMatrix* mtx ); void utilities_FortranMatrixDestroy( utilities_FortranMatrix* mtx ); hypre_longint utilities_FortranMatrixGlobalHeight( utilities_FortranMatrix* mtx ); hypre_longint utilities_FortranMatrixHeight( utilities_FortranMatrix* mtx ); hypre_longint 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_longint i, hypre_longint j ); HYPRE_Real* utilities_FortranMatrixValuePtr( utilities_FortranMatrix* mtx, hypre_longint i, hypre_longint j ); HYPRE_Real utilities_FortranMatrixMaxValue( utilities_FortranMatrix* mtx ); void utilities_FortranMatrixSelectBlock( utilities_FortranMatrix* mtx, hypre_longint iFrom, hypre_longint iTo, hypre_longint jFrom, hypre_longint 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.18.2/src/utilities/headers000077500000000000000000000036521355566575400171310ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 hypre_general.h >> $INTERNAL_HEADER cat mpistubs.h >> $INTERNAL_HEADER cat hypre_smp.h >> $INTERNAL_HEADER cat hypre_memory.h >> $INTERNAL_HEADER cat hypre_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 hypre_error.h >> $INTERNAL_HEADER cat caliper_instrumentation.h >> $INTERNAL_HEADER cat hypre_cuda_utils.h >> $INTERNAL_HEADER cat hypre_handle.h >> $INTERNAL_HEADER cat hypre_nvtx.h >> $INTERNAL_HEADER cat hypre_cuda_reducer.h >> $INTERNAL_HEADER cat protos.h >> $INTERNAL_HEADER #=========================================================================== # Include guards #=========================================================================== cat >> $INTERNAL_HEADER <<@ #ifdef __cplusplus } #endif #endif @ hypre-2.18.2/src/utilities/hypre_ap.c000066400000000000000000000012701355566575400175350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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() { #ifdef HYPRE_NO_GLOBAL_PARTITION return 1; #else return 0; #endif } hypre-2.18.2/src/utilities/hypre_complex.c000066400000000000000000000013501355566575400206030ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 ) { return conj(value); } HYPRE_Real hypre_cabs( HYPRE_Complex value ) { return cabs(value); } HYPRE_Real hypre_creal( HYPRE_Complex value ) { return creal(value); } HYPRE_Real hypre_cimag( HYPRE_Complex value ) { return cimag(value); } #endif hypre-2.18.2/src/utilities/hypre_cuda_reducer.h000066400000000000000000000146421355566575400215760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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) #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) #ifdef __cplusplus extern "C++" { #endif 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ 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) { #ifdef __CUDA_ARCH__ //static __shared__ T shared[32]; // Shared mem for 32 partial sums __shared__ T shared[32]; // Shared mem for 32 partial sums //HYPRE_Int lane = threadIdx.x % warpSize; //HYPRE_Int wid = threadIdx.x / warpSize; HYPRE_Int lane = threadIdx.x & (warpSize - 1); HYPRE_Int wid = threadIdx.x >> 5; val = warpReduceSum(val); // Each warp performs partial reduction if (lane == 0) { shared[wid] = val; // Write reduced value to shared memory } __syncthreads(); // Wait for all partial reductions //read from shared memory only if that warp existed if (threadIdx.x < blockDim.x / warpSize) { val = shared[lane]; } else { val = 0.0; } if (wid == 0) { val = warpReduceSum(val); //Final reduce within first warp } #endif return val; } template __global__ void OneBlockReduceKernel(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 { 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; if (hypre_handle->cuda_reduce_buffer == NULL) { /* allocate for the max size for reducing double6 type */ hypre_handle->cuda_reduce_buffer = hypre_TAlloc(HYPRE_double6, 1024, HYPRE_MEMORY_DEVICE); } d_buf = (T*) hypre_handle->cuda_reduce_buffer; } /* copy constructor */ __host__ __device__ ReduceSum(const ReduceSum& other) { *this = other; } /* reduction within blocks */ __host__ __device__ void BlockReduce() const { #ifdef __CUDA_ARCH__ __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; /* 2nd reduction with only *one* block */ assert(nblocks >= 0 && nblocks <= 1024); const dim3 gDim(1), bDim(1024); HYPRE_CUDA_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() { } }; #ifdef __cplusplus } #endif #endif /* #if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) */ #endif /* #if defined(HYPRE_USING_CUDA) */ #endif /* #ifndef HYPRE_CUDA_REDUCER_H */ hypre-2.18.2/src/utilities/hypre_cuda_utils.c000066400000000000000000000410611355566575400212730ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_CUDA) /* for struct solvers */ HYPRE_Int hypre_exec_policy = HYPRE_MEMORY_DEVICE; __global__ void hypreCUDAKernel_CompileFlagSafetyCheck(HYPRE_Int *cuda_arch) { #ifdef __CUDA_ARCH__ cuda_arch[0] = __CUDA_ARCH__; #endif } void hypre_CudaCompileFlagCheck() { HYPRE_Int device = hypre_HandleCudaDevice(hypre_handle); struct cudaDeviceProp props; cudaGetDeviceProperties(&props, device); HYPRE_Int cuda_arch_actual = props.major*100 + props.minor*10; HYPRE_Int *cuda_arch = hypre_TAlloc(HYPRE_Int, 1, HYPRE_MEMORY_DEVICE); HYPRE_Int h_cuda_arch; dim3 gDim(1,1,1), bDim(1,1,1); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_CompileFlagSafetyCheck, gDim, bDim, cuda_arch ); hypre_TMemcpy(&h_cuda_arch, cuda_arch, HYPRE_Int, 1, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); if (h_cuda_arch != cuda_arch_actual) { hypre_printf("ERROR: Compile arch flags %d does not match actual device arch = sm_%d\n", h_cuda_arch, cuda_arch_actual); } HYPRE_CUDA_CALL(cudaDeviceSynchronize()); hypre_TFree(cuda_arch, HYPRE_MEMORY_DEVICE); } dim3 hypre_GetDefaultCUDABlockDimension() { dim3 bDim(512, 1, 1); return bDim; } dim3 hypre_GetDefaultCUDAGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ) { HYPRE_Int num_blocks = 0; HYPRE_Int num_threads_per_block = bDim.x * bDim.y * bDim.z; 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 >> 5; assert(num_warps_per_block * 32 == 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__); assert(0); } dim3 gDim(num_blocks, 1, 1); return gDim; } /** * Get NNZ of each row in d_row_indices and stored the results in d_rownnz * All pointers are device pointers. * d_rownnz can be the same as d_row_indices */ __global__ void hypreCUDAKernel_GetRowNnz(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 = blockIdx.x * blockDim.x + threadIdx.x; //const HYPRE_Int total_num_threads = gridDim.x * blockDim.x; 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]); } } /* special case: if d_row_indices == NULL, it 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_GetDefaultCUDABlockDimension(); const dim3 gDim = hypre_GetDefaultCUDAGridDimension(nrows, "thread", bDim); /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_CUDA_LAUNCH( hypreCUDAKernel_GetRowNnz, gDim, bDim, nrows, d_row_indices, d_diag_ia, d_offd_ia, d_rownnz ); return hypre_error_flag; } __global__ void hypreCUDAKernel_CopyParCSRRows(HYPRE_Int nrows, HYPRE_Int *d_row_indices, HYPRE_Int has_offd, HYPRE_Int first_col, HYPRE_Int *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 global_warp_id = blockIdx.x * blockDim.y + threadIdx.y; if (global_warp_id >= nrows) { return; } /* lane id inside the warp */ HYPRE_Int lane_id = threadIdx.x; HYPRE_Int i, j, k, 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 = read_only_load(d_ib + global_warp_id); } istart = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); iend = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 1); bstart = __shfl_sync(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 = __shfl_sync(HYPRE_WARP_FULL_MASK, j, 0); iend = __shfl_sync(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); } } } /* B = A(row_indices, :) */ /* d_ib is input that contains row ptrs, of length (nrows + 1) or nrow (without the last entry, nnz) */ /* special case: 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*/ 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) { /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_Int num_warps_per_block = 16; const dim3 bDim(HYPRE_WARP_SIZE, num_warps_per_block); const dim3 gDim((nrows + num_warps_per_block - 1) / num_warps_per_block); /* if (job == 2) { } */ HYPRE_CUDA_LAUNCH( hypreCUDAKernel_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; } HYPRE_Int hypreDevice_IntegerReduceSum(HYPRE_Int n, HYPRE_Int *d_i) { return HYPRE_THRUST_CALL(reduce, d_i, d_i + n); } HYPRE_Int hypreDevice_IntegerInclusiveScan(HYPRE_Int n, HYPRE_Int *d_i) { HYPRE_THRUST_CALL(inclusive_scan, d_i, d_i + n, d_i); return hypre_error_flag; } HYPRE_Int hypreDevice_IntegerExclusiveScan(HYPRE_Int n, HYPRE_Int *d_i) { HYPRE_THRUST_CALL(exclusive_scan, d_i, d_i + n, d_i); return hypre_error_flag; } __global__ void hypreCUDAKernel_CsrRowPtrsToIndices(HYPRE_Int n, HYPRE_Int *ptr, HYPRE_Int *num, HYPRE_Int *idx) { /* warp id in the grid */ HYPRE_Int global_warp_id = blockIdx.x * blockDim.y + threadIdx.y; /* lane id inside the warp */ HYPRE_Int lane_id = threadIdx.x; if (global_warp_id < n) { HYPRE_Int istart, iend, k; if (lane_id < 2) { k = read_only_load(ptr + global_warp_id + lane_id); } istart = __shfl_sync(HYPRE_WARP_FULL_MASK, k, 0); iend = __shfl_sync(HYPRE_WARP_FULL_MASK, k, 1); HYPRE_Int i; for (i = istart + lane_id; i < iend; i += HYPRE_WARP_SIZE) { HYPRE_Int j; if (num == NULL) { j = global_warp_id; } else { j = read_only_load(num + global_warp_id); } idx[i] = j; } } } HYPRE_Int* hypreDevice_CsrRowPtrsToIndices(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ptr) { /* trivial case */ if (nrows <= 0) { return NULL; } HYPRE_Int *d_row_ind = hypre_TAlloc(HYPRE_Int, nnz, HYPRE_MEMORY_DEVICE); HYPRE_Int num_warps_per_block = 16; const dim3 bDim(HYPRE_WARP_SIZE, num_warps_per_block); const dim3 gDim((nrows + num_warps_per_block - 1) / num_warps_per_block); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_CsrRowPtrsToIndices, gDim, bDim, nrows, d_row_ptr, NULL, d_row_ind ); return d_row_ind; } HYPRE_Int hypreDevice_CsrRowPtrsToIndices_v2(HYPRE_Int nrows, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_ind) { /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_Int num_warps_per_block = 16; const dim3 bDim(HYPRE_WARP_SIZE, num_warps_per_block); const dim3 gDim((nrows + num_warps_per_block - 1) / num_warps_per_block); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_CsrRowPtrsToIndices, gDim, bDim, nrows, d_row_ptr, NULL, d_row_ind ); return hypre_error_flag; } HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum(HYPRE_Int nrows, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_num, HYPRE_Int *d_row_ind) { /* trivial case */ if (nrows <= 0) { return hypre_error_flag; } HYPRE_Int num_warps_per_block = 16; const dim3 bDim(HYPRE_WARP_SIZE, num_warps_per_block); const dim3 gDim((nrows + num_warps_per_block - 1) / num_warps_per_block); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_CsrRowPtrsToIndices, gDim, bDim, nrows, d_row_ptr, d_row_num, d_row_ind ); return hypre_error_flag; } 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); HYPRE_THRUST_CALL( lower_bound, d_row_ind, d_row_ind + nnz, thrust::counting_iterator(0), thrust::counting_iterator(nrows+1), d_row_ptr); return d_row_ptr; } HYPRE_Int hypreDevice_CsrRowIndicesToPtrs_v2(HYPRE_Int nrows, HYPRE_Int nnz, HYPRE_Int *d_row_ind, HYPRE_Int *d_row_ptr) { HYPRE_THRUST_CALL( lower_bound, d_row_ind, d_row_ind + nnz, thrust::counting_iterator(0), thrust::counting_iterator(nrows+1), d_row_ptr); return hypre_error_flag; } /* x[map[i]] += y[i] */ __global__ void hypreCUDAKernel_ScatterAdd(HYPRE_Int n, HYPRE_Real *x, HYPRE_Int *map, HYPRE_Real *y) { HYPRE_Int global_thread_id = hypre_cuda_get_grid_thread_id<1,1>(); if (global_thread_id < n) { x[map[global_thread_id]] += y[global_thread_id]; } } /* Generalized x[map[i]] += y[i] where the same index may appear more * than once in map * Note: content in y will be destroyed */ HYPRE_Int hypreDevice_GenScatterAdd(HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y) { HYPRE_Int *map2 = hypre_TAlloc(HYPRE_Int, ny, HYPRE_MEMORY_DEVICE); HYPRE_Int *reduced_map = hypre_TAlloc(HYPRE_Int, ny, HYPRE_MEMORY_DEVICE); HYPRE_Real *reduced_y = hypre_TAlloc(HYPRE_Real, ny, HYPRE_MEMORY_DEVICE); hypre_TMemcpy(map2, map, HYPRE_Int, ny, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_DEVICE); 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); HYPRE_Int reduced_n = new_end.first - reduced_map; hypre_assert(reduced_n == new_end.second - reduced_y); dim3 bDim = hypre_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(reduced_n, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_ScatterAdd, gDim, bDim, reduced_n, x, reduced_map, reduced_y ); hypre_TFree(map2, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_map, HYPRE_MEMORY_DEVICE); hypre_TFree(reduced_y, HYPRE_MEMORY_DEVICE); return hypre_error_flag; } /* x[map[i]] = v */ __global__ void hypreCUDAKernel_ScatterConstant(HYPRE_Int *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Int v) { HYPRE_Int global_thread_id = hypre_cuda_get_grid_thread_id<1,1>(); if (global_thread_id < n) { x[map[global_thread_id]] = v; } } /* x[map[i]] = v * TODO: thrust? */ HYPRE_Int hypreDevice_ScatterConstant(HYPRE_Int *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Int v) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(n, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_ScatterConstant, gDim, bDim, x, n, map, v ); return hypre_error_flag; } __global__ void hypreCUDAKernel_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y) { HYPRE_Int i = hypre_cuda_get_grid_thread_id<1,1>(); if (i < n) { y[i] += x[i] / a[i]; } } /* 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_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(n, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_IVAXPY, gDim, bDim, n, a, x, y ); return hypre_error_flag; } __global__ void hypreCUDAKernel_DiagScaleVector(HYPRE_Int n, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex *y) { HYPRE_Int i = hypre_cuda_get_grid_thread_id<1,1>(); if (i < n) { y[i] = x[i] / A_data[A_i[i]]; } } /* y = diag(A) \ x. A_i[i] points to the ith diagonal entry of A */ HYPRE_Int hypreDevice_DiagScaleVector(HYPRE_Int n, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex *y) { /* trivial case */ if (n <= 0) { return hypre_error_flag; } dim3 bDim = hypre_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(n, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_DiagScaleVector, gDim, bDim, n, A_i, A_data, x, y ); return hypre_error_flag; } __global__ void hypreCUDAKernel_BigToSmallCopy( HYPRE_Int* __restrict__ tgt, const HYPRE_BigInt* __restrict__ src, HYPRE_Int size) { HYPRE_Int i = hypre_cuda_get_grid_thread_id<1,1>(); if (i < size) { tgt[i] = src[i]; } } HYPRE_Int hypreDevice_BigToSmallCopy(HYPRE_Int *tgt, const HYPRE_BigInt *src, HYPRE_Int size) { dim3 bDim = hypre_GetDefaultCUDABlockDimension(); dim3 gDim = hypre_GetDefaultCUDAGridDimension(size, "thread", bDim); HYPRE_CUDA_LAUNCH( hypreCUDAKernel_BigToSmallCopy, gDim, bDim, tgt, src, size); return hypre_error_flag; } /* https://github.com/OrangeOwlSolutions/Thrust/blob/master/Sort_by_key_with_tuple_key.cu */ /* opt: 0, (a,b) <= (a',b') if and only if a < a' or (a = a' and b <= b') * 1, (a,b) <= (a',b') if and only if a < a' or (a = a' and |b| >= |b'|) */ template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt) { 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, TupleComp1()); } else if (opt == 1) { HYPRE_THRUST_CALL(stable_sort_by_key, begin_keys, end_keys, vals, TupleComp2()); } 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); #endif // #if defined(HYPRE_USING_CUDA) hypre-2.18.2/src/utilities/hypre_cuda_utils.h000066400000000000000000000351041355566575400213010ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_CUDA_UTILS_H #define HYPRE_CUDA_UTILS_H #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int hypre_printf( const char *format , ... ); #ifdef __cplusplus extern "C++" { #endif #include #include #include #include #include #include #ifndef CUDART_VERSION #error CUDART_VERSION Undefined! #endif #ifndef CUDA_VERSION #error CUDA_VERSION Undefined! #endif #if defined(HYPRE_USING_CUDA) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace thrust::placeholders; #endif // #if defined(HYPRE_USING_CUDA) #define HYPRE_WARP_SIZE 32 #define HYPRE_WARP_FULL_MASK 0xFFFFFFFF #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 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * macro for launching CUDA kernels, CUDA, Thrust, Cusparse, Curand calls * NOTE: IN HYPRE'S DEFAULT STREAM * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define HYPRE_CUDA_LAUNCH(kernel_name, gridsize, blocksize, ...) \ { \ if ( gridsize.x == 0 || gridsize.y == 0 || gridsize.z == 0 || \ blocksize.x == 0 || blocksize.y == 0 || blocksize.z == 0 ) \ { \ /* hypre_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 \ { \ (kernel_name) <<< (gridsize), (blocksize), 0, hypre_HandleCudaComputeStream(hypre_handle) >>> (__VA_ARGS__); \ } \ } #define HYPRE_THRUST_CALL(func_name, ...) \ thrust::func_name( \ thrust::cuda::par.on(hypre_HandleCudaComputeStream(hypre_handle)), __VA_ARGS__); \ #define HYPRE_CUBLAS_CALL(call) do { \ cublasStatus_t err = call; \ if (CUBLAS_STATUS_SUCCESS != err) { \ hypre_printf("CUBLAS ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUBLAS_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CUSPARSE_CALL(call) do { \ cusparseStatus_t err = call; \ if (CUSPARSE_STATUS_SUCCESS != err) { \ hypre_printf("CUSPARSE ERROR (code = %d, %d) at %s:%d\n", \ err, err == CUSPARSE_STATUS_EXECUTION_FAILED, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CURAND_CALL(call) do { \ curandStatus_t err = call; \ if (CURAND_STATUS_SUCCESS != err) { \ hypre_printf("CURAND ERROR (code = %d) at %s:%d\n", \ err, __FILE__, __LINE__); \ exit(1); \ } } while(0) #define HYPRE_CUDA_CALL(call) do { \ cudaError_t err = call; \ if (cudaSuccess != err) { \ hypre_printf("CUDA ERROR (code = %d, %s) at %s:%d\n", err, cudaGetErrorString(err), __FILE__, __LINE__); \ exit(1); \ } } while(0) #if defined(HYPRE_USING_CUDA) /* return the number of threads in block */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_num_threads() { 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_cuda_get_thread_id() { 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_cuda_get_num_warps() { return hypre_cuda_get_num_threads() >> 5; } /* return the warp id in block */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_warp_id() { return hypre_cuda_get_thread_id() >> 5; } /* return the thread lane id in warp */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_lane_id() { return hypre_cuda_get_thread_id() & (HYPRE_WARP_SIZE-1); } /* return the num of blocks in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_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_cuda_get_block_id() { 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_cuda_get_grid_num_threads() { return hypre_cuda_get_num_blocks() * hypre_cuda_get_num_threads(); } /* return the flattened thread id in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_thread_id() { return hypre_cuda_get_block_id() * hypre_cuda_get_num_threads() + hypre_cuda_get_thread_id(); } /* return the number of warps in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_num_warps() { return hypre_cuda_get_num_blocks() * hypre_cuda_get_num_warps(); } /* return the flattened warp id in grid */ template static __device__ __forceinline__ hypre_int hypre_cuda_get_grid_warp_id() { return hypre_cuda_get_block_id() * hypre_cuda_get_num_warps() + hypre_cuda_get_warp_id(); } #if CUDA_VERSION < 9000 template static __device__ __forceinline__ T __shfl_sync(unsigned mask, T val, hypre_int src_line, hypre_int width=32) { return __shfl(val, src_line, width); } template static __device__ __forceinline__ T __shfl_down_sync(unsigned mask, T val, unsigned delta, hypre_int width=32) { return __shfl_down(val, delta, width); } template static __device__ __forceinline__ T __shfl_xor_sync(unsigned mask, T val, unsigned lanemask, hypre_int width=32) { return __shfl_xor(val, lanemask, width); } template static __device__ __forceinline__ T __shfl_up_sync(unsigned mask, T val, unsigned delta, hypre_int width=32) { return __shfl_up(val, delta, width); } static __device__ __forceinline__ void __syncwarp() { } #endif template static __device__ __forceinline__ T read_only_load( const T *ptr ) { return __ldg( ptr ); } template static __device__ __forceinline__ T warp_prefix_sum(hypre_int lane_id, T in, T &all_sum) { #pragma unroll for (hypre_int d = 2; d <= 32; 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, 31); if (lane_id == 31) { in = 0; } #pragma unroll for (hypre_int d = 16; 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; } template static __device__ __forceinline__ T warp_reduce_sum(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in += __shfl_down_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_allreduce_sum(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in += __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d); } return in; } template static __device__ __forceinline__ T warp_reduce_max(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; 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(T in) { #pragma unroll for (hypre_int d = 16; d > 0; d >>= 1) { in = min(in, __shfl_xor_sync(HYPRE_WARP_FULL_MASK, in, d)); } return in; } 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; } template struct absolute_value : public thrust::unary_function { __host__ __device__ T operator()(const T &x) const { return x < T(0) ? -x : x; } }; template struct TupleComp1 { 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 thrust::get<1>(t1) < thrust::get<1>(t2); } }; 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)); } }; #endif // #if defined(HYPRE_USING_CUDA) #ifdef __cplusplus } #endif struct is_negative { __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < 0); } }; struct is_nonnegative { __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x >= 0); } }; struct in_range { HYPRE_Int low, up; in_range(HYPRE_Int low_, HYPRE_Int up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x >= low && x <= up); } }; struct out_of_range { HYPRE_Int low, up; out_of_range(HYPRE_Int low_, HYPRE_Int up_) { low = low_; up = up_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < low || x > up); } }; struct less_than { HYPRE_Int val; less_than(HYPRE_Int val_) { val = val_; } __host__ __device__ bool operator()(const HYPRE_Int &x) { return (x < val); } }; #if defined(HYPRE_USING_CUDA) /* for struct solvers */ #define HYPRE_MIN_GPU_SIZE (131072) extern HYPRE_Int hypre_exec_policy; #define hypre_SetDeviceOn() hypre_exec_policy = HYPRE_MEMORY_DEVICE #define hypre_SetDeviceOff() hypre_exec_policy = HYPRE_MEMORY_HOST #endif #endif /* HYPRE_USING_CUDA */ #endif /* #ifndef HYPRE_CUDA_UTILS_H */ hypre-2.18.2/src/utilities/hypre_error.c000066400000000000000000000036411355566575400202720ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_Int hypre__global_error = 0; /* Process the error with code ierr raised in the given line of the given source file. */ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg) { hypre_error_flag |= ierr; #ifdef HYPRE_PRINT_ERRORS if (msg) { hypre_fprintf( stderr, "hypre error in file \"%s\", line %d, error code = %d - %s\n", filename, line, ierr, msg); } else { hypre_fprintf( stderr, "hypre error in file \"%s\", line %d, error code = %d\n", filename, line, ierr); } #endif } HYPRE_Int HYPRE_GetError() { 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() { return (hypre_error_flag>>3 & 31); } HYPRE_Int HYPRE_ClearAllErrors() { 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-2.18.2/src/utilities/hypre_error.h000066400000000000000000000025641355566575400203020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /*-------------------------------------------------------------------------- * Global variable used in hypre error checking *--------------------------------------------------------------------------*/ extern HYPRE_Int hypre__global_error; #define hypre_error_flag hypre__global_error /*-------------------------------------------------------------------------- * HYPRE error macros *--------------------------------------------------------------------------*/ void hypre_error_handler(const char *filename, HYPRE_Int line, HYPRE_Int ierr, const char *msg); #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) #ifdef NDEBUG #define hypre_assert(EX) #else #define hypre_assert(EX) if (!(EX)) {hypre_fprintf(stderr,"hypre_assert failed: %s\n", #EX); hypre_error(1);} #endif #endif hypre-2.18.2/src/utilities/hypre_general.c000066400000000000000000000210341355566575400205520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_KOKKOS) #include #endif void hypre_SetExecPolicy( HYPRE_Int policy ) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) if ( policy == HYPRE_EXEC_HOST || policy == HYPRE_EXEC_DEVICE) { hypre_HandleDefaultExecPolicy(hypre_handle) = policy; } #endif } /*--------------------------------------------------- * hypre_GetExecPolicy * Return execution policy based on memory locations *---------------------------------------------------*/ /* for unary operation */ HYPRE_Int hypre_GetExecPolicy1(HYPRE_Int location) { HYPRE_Int exec = HYPRE_EXEC_UNSET; location = hypre_GetActualMemLocation(location); switch (location) { case HYPRE_MEMORY_HOST : exec = HYPRE_EXEC_HOST; break; case HYPRE_MEMORY_HOST_PINNED : exec = HYPRE_EXEC_HOST; break; case HYPRE_MEMORY_DEVICE : exec = HYPRE_EXEC_DEVICE; break; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) case HYPRE_MEMORY_SHARED : exec = hypre_HandleDefaultExecPolicy(hypre_handle); break; #endif } return exec; } /* for binary operation */ HYPRE_Int hypre_GetExecPolicy2(HYPRE_Int location1, HYPRE_Int location2) { location1 = hypre_GetActualMemLocation(location1); location2 = hypre_GetActualMemLocation(location2); /* 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) ) { return HYPRE_EXEC_UNSET; } #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* policy for S-S can be HOST or DEVICE. Choose HOST by default */ if (location1 == HYPRE_MEMORY_SHARED && location2 == HYPRE_MEMORY_SHARED) { return hypre_HandleDefaultExecPolicy(hypre_handle); } #endif if (location1 == HYPRE_MEMORY_HOST || location2 == HYPRE_MEMORY_HOST) { return HYPRE_EXEC_HOST; } if (location1 == HYPRE_MEMORY_DEVICE || location2 == HYPRE_MEMORY_DEVICE) { return HYPRE_EXEC_DEVICE; } return HYPRE_EXEC_UNSET; } hypre_Handle *hypre_handle = NULL; hypre_Handle* hypre_HandleCreate() { hypre_Handle *handle = hypre_CTAlloc(hypre_Handle, 1, HYPRE_MEMORY_HOST); /* set default options */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_HandleDefaultExecPolicy(handle) = HYPRE_EXEC_HOST; hypre_HandleCudaDevice(handle) = 0; hypre_HandleCudaComputeStreamNum(handle) = 0; hypre_HandleCudaPrefetchStreamNum(handle) = 1; hypre_HandleCudaComputeStreamSyncDefault(handle) = 1; handle->spgemm_use_cusparse = 0; // TODO: accessor func #ifdef handle->spgemm_num_passes = 3; /* 1: naive overestimate, 2: naive underestimate, 3: Cohen's algorithm */ handle->spgemm_rownnz_estimate_method = 3; handle->spgemm_rownnz_estimate_nsamples = 32; handle->spgemm_rownnz_estimate_mult_factor = 1.5; handle->spgemm_hash_type = 'L'; hypre_HandleCudaComputeStreamSync(handle).clear(); hypre_HandleCudaComputeStreamSyncPush( handle, hypre_HandleCudaComputeStreamSyncDefault(handle) ); #endif // #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) return handle; } HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int i; hypre_TFree(hypre_handle_->cuda_reduce_buffer, HYPRE_MEMORY_DEVICE); #if defined(HYPRE_USING_CURAND) if (hypre_handle_->curand_gen) { HYPRE_CURAND_CALL( curandDestroyGenerator(hypre_handle_->curand_gen) ); } #endif #if defined(HYPRE_USING_CUBLAS) if (hypre_handle_->cublas_handle) { HYPRE_CUBLAS_CALL( cublasDestroy(hypre_handle_->cublas_handle) ); } #endif #if defined(HYPRE_USING_CUSPARSE) if (hypre_handle_->cusparse_handle) { HYPRE_CUSPARSE_CALL( cusparseDestroy(hypre_handle_->cusparse_handle) ); } if (hypre_handle_->cusparse_mat_descr) { HYPRE_CUSPARSE_CALL( cusparseDestroyMatDescr(hypre_handle_->cusparse_mat_descr) ); } #endif for (i = 0; i < HYPRE_MAX_NUM_STREAMS; i++) { if (hypre_handle_->cuda_streams[i]) { HYPRE_CUDA_CALL( cudaStreamDestroy(hypre_handle_->cuda_streams[i]) ); } } #endif hypre_TFree(hypre_handle_, HYPRE_MEMORY_HOST); return hypre_error_flag; } #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* use_device == -1 to let Hypre decide on which device to use */ HYPRE_Int hypre_SetDevice(HYPRE_Int use_device, hypre_Handle *hypre_handle_) { HYPRE_Int myid, nproc, myNodeid, NodeSize; HYPRE_Int device_id; hypre_MPI_Comm node_comm; // TODO should not use COMM_WORLD hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD, &myid); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD, &nproc); hypre_MPI_Comm_split_type(hypre_MPI_COMM_WORLD, 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_Int nDevices; #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaGetDeviceCount(&nDevices) ); #else nDevices = omp_get_num_devices(); #endif if (use_device < 0) { device_id = myNodeid % nDevices; } else { device_id = use_device; } #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaSetDevice(device_id) ); #else omp_set_default_device(device_id); #endif hypre_HandleCudaDevice(hypre_handle_) = device_id; 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); return hypre_error_flag; } #endif //#if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /****************************************************************************** * * hypre initialization * *****************************************************************************/ HYPRE_Int HYPRE_Init( hypre_int argc, char *argv[] ) { hypre_handle = hypre_HandleCreate(); #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) hypre_SetDevice(-1, hypre_handle); /* To include the cost of creating streams/cudahandles in HYPRE_Init */ /* If not here, will be done at the first use */ hypre_HandleCudaComputeStream(hypre_handle); hypre_HandleCudaPrefetchStream(hypre_handle); #endif #if defined(HYPRE_USING_CUBLAS) hypre_HandleCublasHandle(hypre_handle); #endif #if defined(HYPRE_USING_CUSPARSE) hypre_HandleCusparseHandle(hypre_handle); hypre_HandleCusparseMatDescr(hypre_handle); #endif #if defined(HYPRE_USING_CURAND) hypre_HandleCurandGenerator(hypre_handle); #endif #if defined(HYPRE_USING_KOKKOS) Kokkos::initialize (argc, argv); #endif /* Check if cuda arch flags in compiling match the device */ #if defined(HYPRE_USING_CUDA) hypre_CudaCompileFlagCheck(); #endif #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_OMPOffloadOn(); #endif return hypre_error_flag; } /****************************************************************************** * * hypre finalization * *****************************************************************************/ /* declared in "struct_communication.c" */ extern HYPRE_Complex *global_recv_buffer, *global_send_buffer; extern HYPRE_Int global_recv_size, global_send_size; HYPRE_Int HYPRE_Finalize() { hypre_HandleDestroy(hypre_handle); #if defined(HYPRE_USING_KOKKOS) Kokkos::finalize (); #endif hypre_TFree(global_send_buffer, HYPRE_MEMORY_DEVICE); hypre_TFree(global_recv_buffer, HYPRE_MEMORY_DEVICE); //if (cudaSuccess == cudaPeekAtLastError() ) hypre_printf("OK...\n"); #if defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaGetLastError() ); #endif return hypre_error_flag; } hypre-2.18.2/src/utilities/hypre_general.h000066400000000000000000000030501355566575400205550ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 /* 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; /* This allows us to consistently avoid 'double' throughout hypre */ typedef double hypre_double; /*-------------------------------------------------------------------------- * 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 #endif /* hypre_GENERAL_HEADER */ hypre-2.18.2/src/utilities/hypre_handle.h000066400000000000000000000160211355566575400203750ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 #ifdef __cplusplus extern "C++" { #endif #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) #include #endif typedef struct { HYPRE_Int hypre_error; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_Int default_exec_policy; HYPRE_Int cuda_device; /* by default, hypre puts GPU computations in this stream * Do not be confused with the default (null) CUDA stream */ HYPRE_Int cuda_compute_stream_num; HYPRE_Int cuda_prefetch_stream_num; HYPRE_Int cuda_compute_stream_sync_default; std::vector cuda_compute_stream_sync; curandGenerator_t curand_gen; cublasHandle_t cublas_handle; cusparseHandle_t cusparse_handle; cusparseMatDescr_t cusparse_mat_descr; cudaStream_t cuda_streams[HYPRE_MAX_NUM_STREAMS]; /* work space for hypre's CUDA reducer */ void* cuda_reduce_buffer; /* device spgemm options */ HYPRE_Int spgemm_use_cusparse; HYPRE_Int spgemm_num_passes; HYPRE_Int spgemm_rownnz_estimate_method; HYPRE_Int spgemm_rownnz_estimate_nsamples; float spgemm_rownnz_estimate_mult_factor; char spgemm_hash_type; #endif } hypre_Handle; extern hypre_Handle *hypre_handle; hypre_Handle* hypre_HandleCreate(); HYPRE_Int hypre_HandleDestroy(hypre_Handle *hypre_handle_); /* accessor inline function to hypre_device_csr_handle */ #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) static inline HYPRE_Int & hypre_HandleDefaultExecPolicy(hypre_Handle *hypre_handle_) { return hypre_handle_->default_exec_policy; } static inline HYPRE_Int & hypre_HandleCudaDevice(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_device; } static inline HYPRE_Int & hypre_HandleCudaComputeStreamNum(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_num; } static inline HYPRE_Int & hypre_HandleCudaPrefetchStreamNum(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_prefetch_stream_num; } static inline HYPRE_Int & hypre_HandleCudaComputeStreamSyncDefault(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_sync_default; } static inline std::vector & hypre_HandleCudaComputeStreamSync(hypre_Handle *hypre_handle_) { return hypre_handle_->cuda_compute_stream_sync; } static inline cudaStream_t hypre_HandleCudaStream(hypre_Handle *hypre_handle_, HYPRE_Int i) { cudaStream_t stream = 0; #if defined(HYPRE_USING_CUDA_STREAMS) if (i >= HYPRE_MAX_NUM_STREAMS) { /* return the default stream, i.e., the NULL stream */ /* hypre_printf("CUDA stream %d exceeds the max number %d\n", i, HYPRE_MAX_NUM_STREAMS); */ return NULL; } if (hypre_handle_->cuda_streams[i]) { return hypre_handle_->cuda_streams[i]; } //HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream,cudaStreamNonBlocking)); HYPRE_CUDA_CALL(cudaStreamCreateWithFlags(&stream, cudaStreamDefault)); hypre_handle_->cuda_streams[i] = stream; #endif return stream; } static inline cudaStream_t hypre_HandleCudaComputeStream(hypre_Handle *hypre_handle_) { return hypre_HandleCudaStream(hypre_handle_, hypre_HandleCudaComputeStreamNum(hypre_handle_)); } static inline cudaStream_t hypre_HandleCudaPrefetchStream(hypre_Handle *hypre_handle_) { return hypre_HandleCudaStream(hypre_handle_, hypre_HandleCudaPrefetchStreamNum(hypre_handle_)); } static inline curandGenerator_t hypre_HandleCurandGenerator(hypre_Handle *hypre_handle_) { if (hypre_handle_->curand_gen) { return hypre_handle_->curand_gen; } curandGenerator_t gen; HYPRE_CURAND_CALL( curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT) ); HYPRE_CURAND_CALL( curandSetPseudoRandomGeneratorSeed(gen, 1234ULL) ); HYPRE_CURAND_CALL( curandSetStream(gen, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->curand_gen = gen; return gen; } static inline cublasHandle_t hypre_HandleCublasHandle(hypre_Handle *hypre_handle_) { if (hypre_handle_->cublas_handle) { return hypre_handle_->cublas_handle; } cublasHandle_t handle; HYPRE_CUBLAS_CALL( cublasCreate(&handle) ); HYPRE_CUBLAS_CALL( cublasSetStream(handle, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->cublas_handle = handle; return handle; } static inline cusparseHandle_t hypre_HandleCusparseHandle(hypre_Handle *hypre_handle_) { if (hypre_handle_->cusparse_handle) { return hypre_handle_->cusparse_handle; } cusparseHandle_t handle; HYPRE_CUSPARSE_CALL( cusparseCreate(&handle) ); HYPRE_CUSPARSE_CALL( cusparseSetStream(handle, hypre_HandleCudaComputeStream(hypre_handle_)) ); hypre_handle_->cusparse_handle = handle; return handle; } static inline cusparseMatDescr_t hypre_HandleCusparseMatDescr(hypre_Handle *hypre_handle_) { if (hypre_handle_->cusparse_mat_descr) { return hypre_handle_->cusparse_mat_descr; } 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_handle_->cusparse_mat_descr = mat_descr; return mat_descr; } #endif /* defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) */ static inline void hypre_HandleCudaComputeStreamSyncPush(hypre_Handle *hypre_handle_, HYPRE_Int sync) { #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_UNIFIED_MEMORY) hypre_HandleCudaComputeStreamSync(hypre_handle_).push_back(sync); #endif } static inline void hypre_HandleCudaComputeStreamSyncPop(hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_CUDA) && defined(HYPRE_USING_UNIFIED_MEMORY) hypre_HandleCudaComputeStreamSync(hypre_handle_).pop_back(); #endif } /* synchronize the default stream */ static inline HYPRE_Int hypre_SyncCudaComputeStream(hypre_Handle *hypre_handle_) { #if defined(HYPRE_USING_UNIFIED_MEMORY) #if defined(HYPRE_USING_CUDA) assert(!hypre_HandleCudaComputeStreamSync(hypre_handle_).empty()); if ( hypre_HandleCudaComputeStreamSync(hypre_handle_).back() ) { HYPRE_CUDA_CALL( cudaStreamSynchronize(hypre_HandleCudaComputeStream(hypre_handle_)) ); } #endif #if defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); #endif #endif /* #if defined(HYPRE_USING_UNIFIED_MEMORY) */ return hypre_error_flag; } #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/utilities/hypre_hopscotch_hash.c000066400000000000000000000221621355566575400221350ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other * HYPRE Project Developers. See the top-level COPYRIGHT file for details. * * SPDX-License-Identifier: (Apache-2.0 OR MIT) ******************************************************************************/ #include "hypre_hopscotch_hash.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.18.2/src/utilities/hypre_hopscotch_hash.h000066400000000000000000001041671355566575400221500ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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_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_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_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 .......................................................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH static inline HYPRE_Int first_lsb_bit_indx(hypre_uint x) { return ffs(x) - 1; } #endif /** * 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_BigInt hypre_BigHash(HYPRE_BigInt input) { hypre_ulongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulongint 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); assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline 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; //assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif #ifdef HYPRE_BIGINT static inline HYPRE_Int hypre_Hash(HYPRE_Int input) { hypre_ulongint h64 = HYPRE_XXH_PRIME64_5 + sizeof(input); hypre_ulongint 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); assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h64); } #endif return h64; } #else static inline 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; //assert(HYPRE_HOPSCOTCH_HASH_EMPTY != h32); return h32; } #endif static inline 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 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 void hypre_UnorderedIntMapFindCloserFreeBucket( hypre_UnorderedIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* start_seg, #endif hypre_HopscotchBucket** free_bucket, HYPRE_Int* free_dist) { 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 |= (1U << move_free_dist); 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 void hypre_UnorderedBigIntMapFindCloserFreeBucket( hypre_UnorderedBigIntMap *m, #ifdef HYPRE_CONCURRENT_HOPSCOTCH hypre_HopscotchSegment* start_seg, #endif hypre_BigHopscotchBucket** free_bucket, HYPRE_Int* free_dist) { 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 |= (1U << move_free_dist); 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 ......................................................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH static inline 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 ................ hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; 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; } HYPRE_Int startTimestamp = segment->timestamp; 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); } if (segment->timestamp == startTimestamp) return 0; 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_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 ................ hypre_HopscotchSegment *segment = &s->segments[(HYPRE_Int)(hash & s->segmentMask)]; 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; } HYPRE_Int startTimestamp = segment->timestamp; 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); } if (segment->timestamp == startTimestamp) return 0; 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_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 ................ hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; 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; } HYPRE_Int startTimestamp = segment->timestamp; 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); } if (segment->timestamp == startTimestamp) return -1; 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_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 ................ hypre_HopscotchSegment *segment = &m->segments[(HYPRE_Int)(hash & m->segmentMask)]; 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; } HYPRE_Int startTimestamp = segment->timestamp; 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); } if (segment->timestamp == startTimestamp) return -1; 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; } #endif //status Operations ......................................................... static inline 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_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_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_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 ................................................... #ifdef HYPRE_CONCURRENT_HOPSCOTCH static inline 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 .................... hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); 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]) { omp_unset_lock(&segment->lock); 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; omp_unset_lock(&segment->lock); return; } hypre_UnorderedIntSetFindCloserFreeBucket(s, segment, &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 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 .................... hypre_HopscotchSegment *segment = &s->segments[hash & s->segmentMask]; omp_set_lock(&segment->lock); 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]) { omp_unset_lock(&segment->lock); 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; omp_unset_lock(&segment->lock); return; } hypre_UnorderedBigIntSetFindCloserFreeBucket(s, segment, &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_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 .................... hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); 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; omp_unset_lock(&segment->lock); 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 == __sync_val_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 |= 1U << free_dist; omp_unset_lock(&segment->lock); return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedIntMapFindCloserFreeBucket(m, segment, &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_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 .................... hypre_HopscotchSegment *segment = &m->segments[hash & m->segmentMask]; omp_set_lock(&segment->lock); 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; omp_unset_lock(&segment->lock); 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 == __sync_val_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 |= 1U << free_dist; omp_unset_lock(&segment->lock); return HYPRE_HOPSCOTCH_HASH_EMPTY; } hypre_UnorderedBigIntMapFindCloserFreeBucket(m, segment, &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; } #endif #ifdef __cplusplus } // extern "C" #endif #endif // hypre_HOPSCOTCH_HASH_HEADER hypre-2.18.2/src/utilities/hypre_memory.c000066400000000000000000000435211355566575400204520ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "../struct_mv/_hypre_struct_mv.h" #ifdef HYPRE_USE_UMALLOC #undef HYPRE_USE_UMALLOC #endif /****************************************************************************** * * Helper routines * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_OutOfMemory *--------------------------------------------------------------------------*/ static inline void hypre_OutOfMemory(size_t size) { hypre_error_w_msg(HYPRE_ERROR_MEMORY,"Out of memory trying to allocate too many bytes\n"); fflush(stdout); } static inline void hypre_WrongMemoryLocation() { hypre_error_w_msg(HYPRE_ERROR_MEMORY,"Wrong HYPRE MEMORY location: \n Only HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_SHARED,\n and HYPRE_MEMORY_HOST_PINNED are supported!\n"); fflush(stdout); } /*-------------------------------------------------------------------------- * hypre_GetPadMemsize: * Device/HostPinned malloc stores the size in bytes at the beginning size_t *--------------------------------------------------------------------------*/ static inline size_t hypre_GetPadMemsize(void *ptr, HYPRE_Int location) { location = hypre_GetActualMemLocation(location); /* no stored size for host memory */ if (location == HYPRE_MEMORY_HOST) { return 0; } size_t *sp = (size_t*) ptr - HYPRE_MEM_PAD_LEN; if (location == HYPRE_MEMORY_DEVICE) { /* special case for mapped device openmp; size available on host memory */ #if defined(HYPRE_DEVICE_OPENMP_MAPPED) return *sp; #else /* copy size from device memory */ size_t size; hypre_Memcpy(&size, sp, sizeof(size_t), HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE); return size; #endif } if (location == HYPRE_MEMORY_SHARED) { return *sp; } if (location == HYPRE_MEMORY_HOST_PINNED) { return *sp; } hypre_WrongMemoryLocation(); /* no stored size for host memory */ return 0; } /****************************************************************************** * * Standard routines * *****************************************************************************/ /*-------------------------------------------------------------------------- * hypre_MAlloc *--------------------------------------------------------------------------*/ static inline void * hypre_HostMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; if (zeroinit) { ptr = calloc(size, 1); } else { ptr = malloc(size); } return ptr; } static inline void * hypre_DeviceMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; /* without UM, device alloc */ #if defined(HYPRE_DEVICE_OPENMP_ALLOC) /* omp target alloc */ ptr = omp_target_alloc(size + sizeof(size_t)*HYPRE_MEM_PAD_LEN, hypre__offload_device_num); size_t *sp = (size_t*) ptr; #pragma omp target is_device_ptr(sp) { sp[0] = size; } ptr = (void*) (&sp[HYPRE_MEM_PAD_LEN]); #elif defined(HYPRE_USING_DEVICE_OPENMP) /* omp target map */ ptr = malloc(size + sizeof(size_t)*HYPRE_MEM_PAD_LEN); size_t *sp = (size_t*) ptr; sp[0] = size; ptr = (void *) (&sp[HYPRE_MEM_PAD_LEN]); HYPRE_OMPOffload(hypre__offload_device_num, ptr, size, "enter", "alloc"); #elif defined(HYPRE_USING_CUDA) /* cudaMalloc */ HYPRE_CUDA_CALL( cudaMalloc(&ptr, size + sizeof(size_t)*HYPRE_MEM_PAD_LEN) ); HYPRE_CUDA_CALL( cudaDeviceSynchronize() ); hypre_Memcpy(ptr, &size, sizeof(size_t), HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST); size_t *sp = (size_t*) ptr; ptr = (void*) (&sp[HYPRE_MEM_PAD_LEN]); #endif /* after device alloc, memset to 0 */ if (ptr && zeroinit) { hypre_Memset(ptr, 0, size, HYPRE_MEMORY_DEVICE); } return ptr; } static inline void * hypre_UnifiedMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) size_t count = size + sizeof(size_t)*HYPRE_MEM_PAD_LEN; /* with UM, managed memory alloc */ HYPRE_CUDA_CALL( cudaMallocManaged(&ptr, count, cudaMemAttachGlobal) ); HYPRE_Int device = hypre_HandleCudaDevice(hypre_handle); HYPRE_CUDA_CALL( cudaMemAdvise(ptr, count, cudaMemAdviseSetPreferredLocation, device) ); size_t *sp = (size_t*) ptr; sp[0] = size; ptr = (void*) (&sp[HYPRE_MEM_PAD_LEN]); /* after UM alloc, memset to 0 */ if (zeroinit) { hypre_Memset(ptr, 0, size, HYPRE_MEMORY_SHARED); } #endif return ptr; } static inline void * hypre_HostPinnedMalloc(size_t size, HYPRE_Int zeroinit) { void *ptr = NULL; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* TODO which one of the following two? */ /* HYPRE_CUDA_CALL( cudaHostAlloc(&ptr,size + sizeof(size_t)*HYPRE_MEM_PAD_LEN, cudaHostAllocMapped)); */ HYPRE_CUDA_CALL( cudaMallocHost(&ptr, size + sizeof(size_t)*HYPRE_MEM_PAD_LEN) ); size_t *sp = (size_t*) ptr; sp[0] = size; ptr = (void*) (&sp[HYPRE_MEM_PAD_LEN]); /* after host alloc, memset to 0 */ if (zeroinit) { hypre_Memset(ptr, 0, size, HYPRE_MEMORY_HOST_PINNED); } #endif return ptr; } static inline void * hypre_MAlloc_core(size_t size, HYPRE_Int zeroinit, HYPRE_Int location) { if (size == 0) { return NULL; } void *ptr = NULL; location = hypre_GetActualMemLocation(location); switch (location) { case HYPRE_MEMORY_HOST : /* ask for cpu memory */ ptr = hypre_HostMalloc(size, zeroinit); break; case HYPRE_MEMORY_DEVICE : /* ask for device memory */ ptr = hypre_DeviceMalloc(size, zeroinit); break; case HYPRE_MEMORY_SHARED : /* ask for unified memory */ ptr = hypre_UnifiedMalloc(size, zeroinit); break; case HYPRE_MEMORY_HOST_PINNED : /* ask for page-locked memory on the host */ ptr = hypre_HostPinnedMalloc(size, zeroinit); break; default : /* unrecognized location */ hypre_WrongMemoryLocation(); } if (!ptr) { hypre_OutOfMemory(size); exit(0); } return ptr; } void * hypre_MAlloc(size_t size, HYPRE_Int location) { return hypre_MAlloc_core(size, 0, location); } void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_Int location) { return hypre_MAlloc_core(count * elt_size, 1, location); } /*-------------------------------------------------------------------------- * hypre_Free *--------------------------------------------------------------------------*/ static inline void hypre_HostFree(void *ptr) { free(ptr); } static inline void hypre_DeviceFree(void *ptr) { /* without UM, device free */ #if defined(HYPRE_DEVICE_OPENMP_ALLOC) size_t *sp = (size_t *) ptr; ptr = (void *) (&sp[-HYPRE_MEM_PAD_LEN]); omp_target_free(ptr, hypre__offload_device_num); #elif defined(HYPRE_USING_DEVICE_OPENMP) size_t size = ((size_t *) ptr)[-HYPRE_MEM_PAD_LEN]; HYPRE_OMPOffload(hypre__offload_device_num, ptr, size, "exit", "delete"); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaFree((size_t *) ptr - HYPRE_MEM_PAD_LEN) ); //cudaSafeFree(ptr, HYPRE_MEM_PAD_LEN); #endif } static inline void hypre_UnifiedFree(void *ptr) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* with UM, managed memory free */ //HYPRE_CUDA_CALL( cudaFree((size_t *) ptr - HYPRE_MEM_PAD_LEN) ); cudaFree((size_t *) ptr - HYPRE_MEM_PAD_LEN); //cudaSafeFree(ptr, HYPRE_MEM_PAD_LEN); #endif } static inline void hypre_HostPinnedFree(void *ptr) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) /* page-locked memory on the host */ HYPRE_CUDA_CALL( cudaFreeHost((size_t *) ptr - HYPRE_MEM_PAD_LEN) ); //cudaSafeFree(ptr, HYPRE_MEM_PAD_LEN); #endif } void hypre_Free(void *ptr, HYPRE_Int location) { if (!ptr) { return; } location = hypre_GetActualMemLocation(location); switch (location) { case HYPRE_MEMORY_HOST : /* free cpu memory */ hypre_HostFree(ptr); break; case HYPRE_MEMORY_DEVICE : /* free device memory */ hypre_DeviceFree(ptr); break; case HYPRE_MEMORY_SHARED : /* free unified memory */ hypre_UnifiedFree(ptr); break; case HYPRE_MEMORY_HOST_PINNED : /* free host page-locked memory */ hypre_HostPinnedFree(ptr); break; default : /* unrecognized location */ hypre_WrongMemoryLocation(); } } /*-------------------------------------------------------------------------- * hypre_ReAlloc *--------------------------------------------------------------------------*/ static inline void * hypre_HostReAlloc(void *ptr, size_t size) { return realloc(ptr, size); } static inline void * hypre_Device_Unified_HostPinned_ReAlloc(void *ptr, size_t size, HYPRE_Int location) { /* device/unified/hostpinned memory realloc: malloc+copy+free */ void *new_ptr = hypre_MAlloc(size, location); size_t old_size = hypre_GetPadMemsize(ptr, location); size_t smaller_size = size > old_size ? old_size : size; hypre_Memcpy(new_ptr, ptr, smaller_size, location, location); hypre_Free(ptr, location); return new_ptr; } void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_Int location) { location = hypre_GetActualMemLocation(location); if (size == 0) { hypre_Free(ptr, location); return NULL; } if (ptr == NULL) { return hypre_MAlloc(size, location); } switch (location) { case HYPRE_MEMORY_HOST : /* realloc cpu memory */ ptr = hypre_HostReAlloc(ptr, size); break; case HYPRE_MEMORY_DEVICE : /* realloc device memory */ case HYPRE_MEMORY_SHARED : /* realloc unified memory */ case HYPRE_MEMORY_HOST_PINNED : /* realloc host pinned memory */ ptr = hypre_Device_Unified_HostPinned_ReAlloc(ptr, size, location); break; default : /* unrecognized location */ hypre_WrongMemoryLocation(); } if (!ptr) { hypre_OutOfMemory(size); } return ptr; } /*-------------------------------------------------------------------------- * hypre_Memcpy *--------------------------------------------------------------------------*/ void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_Int loc_dst, HYPRE_Int loc_src) { if (dst == NULL || src == NULL) { if (size) { hypre_printf("hypre_Memcpy warning: copy %ld bytes from %p to %p !\n", size, src, dst); } return; } loc_dst = hypre_GetActualMemLocation(loc_dst); loc_src = hypre_GetActualMemLocation(loc_src); /* special uses for GPU shared memory prefetch */ #if defined(HYPRE_USING_UNIFIED_MEMORY) if ( dst == src && loc_src == HYPRE_MEMORY_SHARED && (loc_dst == HYPRE_MEMORY_DEVICE || loc_dst == HYPRE_MEMORY_HOST) ) { /* src (== dst) must point to cuda unified memory */ if (loc_dst == HYPRE_MEMORY_DEVICE) { HYPRE_CUDA_CALL( cudaMemPrefetchAsync(src, size, hypre_HandleCudaDevice(hypre_handle), hypre_HandleCudaPrefetchStream(hypre_handle)) ); } else if (loc_dst == HYPRE_MEMORY_HOST) { HYPRE_CUDA_CALL( cudaMemPrefetchAsync(src, size, cudaCpuDeviceId, hypre_HandleCudaPrefetchStream(hypre_handle)) ); } /* HYPRE_CUDA_CALL( cudaStreamSynchronize(hypre_HandleCudaPrefetchStream(hypre_handle)) ); */ return; } #endif /* 4 x 4 = 16 cases = 9 + 2 + 2 + 2 + 1 */ /* 9: Host <-- Host, Host <-- Shared, Host <-- Pinned, * Shared <-- Host, Shared <-- Shared, Shared <-- Pinned, * Pinned <-- Host, Pinned <-- Shared, Pinned <-- Pinned. * (i.e, without Device involved) */ if (loc_dst != HYPRE_MEMORY_DEVICE && loc_src != HYPRE_MEMORY_DEVICE) { memcpy(dst, src, size); return; } /* 2: Shared <-- Device, Device <-- Shared */ if (loc_dst == HYPRE_MEMORY_SHARED || loc_src == HYPRE_MEMORY_SHARED) { #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice) ); #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_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_host_num); #elif defined(HYPRE_USING_DEVICE_OPENMP) memcpy(dst, src, size); HYPRE_OMPOffload(hypre__offload_device_num, dst, size, "update", "to"); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyHostToDevice) ); #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_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_host_num, hypre__offload_device_num); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_OMPOffload(hypre__offload_device_num, src, size, "update", "from"); memcpy(dst, src, size); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy( dst, src, size, cudaMemcpyDeviceToHost) ); #endif return; } /* 1: Device <-- Device */ if (loc_dst == HYPRE_MEMORY_DEVICE && loc_src == HYPRE_MEMORY_DEVICE) { #if defined(HYPRE_DEVICE_OPENMP_ALLOC) omp_target_memcpy(dst, src, size, 0, 0, hypre__offload_device_num, hypre__offload_device_num); #elif defined(HYPRE_USING_DEVICE_OPENMP) HYPRE_OMPOffload(hypre__offload_device_num, src, size, "update", "from"); memcpy(dst, src, size); HYPRE_OMPOffload(hypre__offload_device_num, dst, size, "update", "to"); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice) ); #endif return; } hypre_WrongMemoryLocation(); } /*-------------------------------------------------------------------------- * hypre_Memset * "Sets the first num bytes of the block of memory pointed by ptr to the specified value * (*** interpreted as an unsigned char ***)" * http://www.cplusplus.com/reference/cstring/memset/ *--------------------------------------------------------------------------*/ void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_Int 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; } location = hypre_GetActualMemLocation(location); #if defined(HYPRE_DEVICE_OPENMP_ALLOC) unsigned char *ucptr = (unsigned char *) ptr; unsigned char ucvalue = (unsigned char) value; #endif switch (location) { case HYPRE_MEMORY_HOST : /* memset cpu memory */ case HYPRE_MEMORY_HOST_PINNED : /* memset host pinned memory */ memset(ptr, value, num); break; case HYPRE_MEMORY_DEVICE : /* memset device memory */ #if defined(HYPRE_DEVICE_OPENMP_ALLOC) #define DEVICE_VAR is_device_ptr(ucptr) hypre_LoopBegin(num, k) { ucptr[k] = ucvalue; } hypre_LoopEnd() #undef DEVICE_VAR #elif defined(HYPRE_USING_DEVICE_OPENMP) memset(ptr, value, num); HYPRE_OMPOffload(hypre__offload_device_num, ptr, num, "update", "to"); #elif defined(HYPRE_USING_CUDA) HYPRE_CUDA_CALL( cudaMemset(ptr, value, num) ); #endif break; case HYPRE_MEMORY_SHARED : /* memset unified memory */ memset(ptr, value, num); break; default : /* unrecognized location */ hypre_WrongMemoryLocation(); } return ptr; } HYPRE_Int hypre_GetMemoryLocation(const void *ptr, HYPRE_Int *memory_location) { HYPRE_Int ierr = 0; #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) struct cudaPointerAttributes attr; *memory_location = HYPRE_MEMORY_UNSET; #if (CUDART_VERSION >= 10000) HYPRE_CUDA_CALL( cudaPointerGetAttributes(&attr, ptr) ); 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_SHARED; } #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_SHARED; } else if (attr.memoryType == cudaMemoryTypeDevice) { *memory_location = HYPRE_MEMORY_DEVICE; } else if (attr.memoryType == cudaMemoryTypeHost) { *memory_location = HYPRE_MEMORY_HOST_PINNED; } #endif #else /* #if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_DEVICE_OPENMP) */ *memory_location = HYPRE_MEMORY_HOST; #endif return ierr; } hypre-2.18.2/src/utilities/hypre_memory.h000066400000000000000000000253421355566575400204600ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 * * Questions: * * 1. prefetch? * *****************************************************************************/ #ifndef hypre_MEMORY_HEADER #define hypre_MEMORY_HEADER #include #include /* 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 #define HYPRE_MEMORY_UNSET (-1) #define HYPRE_MEMORY_DEVICE ( 0) #define HYPRE_MEMORY_HOST ( 1) #define HYPRE_MEMORY_SHARED ( 2) #define HYPRE_MEMORY_HOST_PINNED ( 3) #define HYPRE_EXEC_UNSET (-1) #define HYPRE_EXEC_DEVICE ( 0) #define HYPRE_EXEC_HOST ( 1) /*================================================================== * default def of memory location selected based memory env * +-------------------------------------------------------------+ * | | HYPRE_MEMORY_* | * | MEM \ LOC | HOST | DEVICE | SHARED | PINNED | * |---------------------------+---------------+-----------------| * | HYPRE_USING_HOST_MEMORY | HOST | HOST | HOST | HOST | * |---------------------------+---------------+-------- --------| * | HYPRE_USING_DEVICE_MEMORY | HOST | DEVICE | DEVICE | PINNED | * |---------------------------+---------------+-----------------| * | HYPRE_USING_UNIFIED_MEMORY| HOST | DEVICE | SHARED | PINNED | * +-------------------------------------------------------------+ *==================================================================*/ #if defined(HYPRE_USING_HOST_MEMORY) /* default memory model without device (host only) */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST #elif defined(HYPRE_USING_DEVICE_MEMORY) /* default memory model with device and without unified memory */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST_PINNED #elif defined(HYPRE_USING_UNIFIED_MEMORY) /* default memory model with device and with unified memory */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_DEVICE #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_SHARED //#define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST_PINNED #else /* default */ #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_HOST #define HYPRE_MEMORY_HOST_PINNED_ACT HYPRE_MEMORY_HOST #endif /* the above definitions might be overridden to customize * memory locations */ /* #undef HYPRE_MEMORY_HOST_ACT */ /* #undef HYPRE_MEMORY_DEVICE_ACT */ /* #undef HYPRE_MEMORY_SHARED_ACT */ /* #undef HYPRE_MEMORY_PINNED_ACT */ /* #define HYPRE_MEMORY_HOST_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_DEVICE_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_SHARED_ACT HYPRE_MEMORY_? */ /* #define HYPRE_MEMORY_PINNED_ACT HYPRE_MEMORY_? */ /*------------------------------------------------------- * hypre_GetActualMemLocation * return actual location based on the selected memory model *-------------------------------------------------------*/ static inline HYPRE_Int hypre_GetActualMemLocation(HYPRE_Int location) { if (location == HYPRE_MEMORY_HOST) { return HYPRE_MEMORY_HOST_ACT; } if (location == HYPRE_MEMORY_DEVICE) { return HYPRE_MEMORY_DEVICE_ACT; } if (location == HYPRE_MEMORY_SHARED) { return HYPRE_MEMORY_SHARED_ACT; } if (location == HYPRE_MEMORY_HOST_PINNED) { return HYPRE_MEMORY_HOST_PINNED_ACT; } return HYPRE_MEMORY_UNSET; } #define HYPRE_MEM_PAD_LEN 1 #if 0 /* These Allocs are with printfs, for debug */ #define hypre_TAlloc(type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] TALLOC %.3f MB\n", __FILE__,__LINE__, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *) hypre_MAlloc((size_t)(sizeof(type) * (count)), location); \ }\ ) #define hypre_CTAlloc(type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] CTALLOC %.3f MB\n", __FILE__,__LINE__, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *) hypre_CAlloc((size_t)(count), (size_t)sizeof(type), location); \ }\ ) #define hypre_TReAlloc(ptr, type, count, location) \ (\ {\ if (location == HYPRE_MEMORY_DEVICE) printf("[%s:%d] TReALLOC %p, %.3f MB\n", __FILE__,__LINE__, ptr, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ (type *)hypre_ReAlloc((char *)ptr, (size_t)(sizeof(type) * (count)), location); \ }\ ) #define hypre_TMemcpy(dst, src, type, count, locdst, locsrc) \ ( \ { \ printf("[%s:%d] TMemcpy %d to %d %.3f MB\n", __FILE__,__LINE__, locsrc, locdst, (size_t)(sizeof(type) * (count))/1024.0/1024.0); \ hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc); \ } \ ) #else #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_TMemcpy(dst, src, type, count, locdst, locsrc) \ (hypre_Memcpy((void *)(dst), (void *)(src), (size_t)(sizeof(type) * (count)), locdst, locsrc)) #endif #define hypre_TFree(ptr, location) \ ( hypre_Free((void *)ptr, location), ptr = NULL ) /*-------------------------------------------------------------------------- * Prototypes *--------------------------------------------------------------------------*/ /* hypre_memory.c */ void * hypre_MAlloc(size_t size, HYPRE_Int location); void * hypre_CAlloc( size_t count, size_t elt_size, HYPRE_Int location); void * hypre_ReAlloc(void *ptr, size_t size, HYPRE_Int location); void hypre_Memcpy(void *dst, void *src, size_t size, HYPRE_Int loc_dst, HYPRE_Int loc_src); void * hypre_Memset(void *ptr, HYPRE_Int value, size_t num, HYPRE_Int location); void hypre_Free(void *ptr, HYPRE_Int location); HYPRE_Int hypre_GetMemoryLocation(const void *ptr, HYPRE_Int *memory_location); /* 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-2.18.2/src/utilities/hypre_merge_sort.c000066400000000000000000000476331355566575400213200ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_hopscotch_hash.h" #include "../seq_mv/HYPRE_seq_mv.h" //#define DBG_MERGE_SORT #ifdef DBG_MERGE_SORT #include #include #include #endif #define SWAP(T, a, b) do { T tmp = a; a = b; b = tmp; } while (0) /* union of two sorted (in ascending order) array arr1 and arr2 into arr3 * Assumption: no duplicates in arr1 and arr2 * arr3 should have enough space on entry * 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; } 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; } } #ifdef HYPRE_CONCURRENT_HOPSCOTCH 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; } } #endif 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 assert(left <= right && right <= k); assert(i < k); // i == k implies left == right == k that can never happen 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 */ 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 assert(*out1 + *out2 == k); #endif } #ifdef HYPRE_CONCURRENT_HOPSCOTCH 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 assert(left <= right && right <= k); assert(i < k); // i == k implies left == right == k that can never happen 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 */ 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 assert(*out1 + *out2 == k); #endif } #endif /** * @param num_threads number of threads that participate in this merge * @param my_thread_num thread id (zeor-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 assert(std::is_sorted(first1, last1)); 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 assert(begin1 <= end1); assert(begin2 <= end2); #endif hypre_merge( first1 + begin1, first1 + end1, first2 + begin2, first2 + end2, out + begin1 + begin2); #ifdef DBG_MERGE_SORT assert(std::is_sorted(out + begin1 + begin2, out + end1 + end2)); #endif } #ifdef HYPRE_CONCURRENT_HOPSCOTCH /** * @param num_threads number of threads that participate in this merge * @param my_thread_num thread id (zeor-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 assert(std::is_sorted(first1, last1)); 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 assert(begin1 <= end1); 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 assert(std::is_sorted(out + begin1 + begin2, out + end1 + end2)); #endif } #endif 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 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 } #ifdef HYPRE_CONCURRENT_HOPSCOTCH 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; #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0; i < len; i++) { HYPRE_Int old = hypre_UnorderedIntMapPutIfAbsent(inverse_map, (*out)[i], i); 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]); 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]); assert(false); } } 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 } #ifdef HYPRE_CONCURRENT_HOPSCOTCH 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 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 } 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; #pragma omp parallel for HYPRE_SMP_SCHEDULE for (i = 0; i < len; i++) { HYPRE_Int old = hypre_UnorderedBigIntMapPutIfAbsent(inverse_map, (*out)[i], i); 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]); 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]); assert(false); } } 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 } #endif #endif /* vim: set tabstop=8 softtabstop=3 sw=3 expandtab: */ hypre-2.18.2/src/utilities/hypre_mpi_comm_f2c.c000066400000000000000000000016371355566575400214760ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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.18.2/src/utilities/hypre_nvtx.h000066400000000000000000000024521355566575400201440ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_NVTX_H #define HYPRE_NVTX_H #ifdef HYPRE_USING_NVTX #include "nvToolsExt.h" #include "nvToolsExtCudaRt.h" static const uint32_t colors[] = { 0x0000ff00, 0x000000ff, 0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x00ff0000, 0x00ffffff }; static const hypre_int num_colors = sizeof(colors)/sizeof(uint32_t); #define PUSH_RANGE(name,cid) { \ hypre_int color_id = cid; \ color_id = color_id%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); \ } #define POP_RANGE nvtxRangePop(); #else /* HYPRE_USING_NVTX */ #define PUSH_RANGE(name,cid) #define POP_RANGE #endif /* HYPRE_USING_NVTX */ #endif /* HYPRE_NVTX_H */ hypre-2.18.2/src/utilities/hypre_omp_device.c000066400000000000000000000051711355566575400212530ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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_omp45_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_fprintf(stdout, "Hypre OMP 4.5 offloading has been turned on. Device %d\n", hypre__offload_device_num); return 0; } HYPRE_Int HYPRE_OMPOffloadOff() { fprintf(stdout, "Hypre OMP 4.5 offloading has been turned off\n"); 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.18.2/src/utilities/hypre_omp_device.h000066400000000000000000000130171355566575400212560ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_omp45_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(); HYPRE_Int HYPRE_OMPOffloadOff(); HYPRE_Int HYPRE_OMPOffloadStatPrint(); #define HYPRE_MIN_GPU_SIZE (131072) #define hypre_SetDeviceOn() HYPRE_OMPOffloadOn() #define hypre_SetDeviceOff() HYPRE_OMPOffloadOff() #endif /* HYPRE_USING_DEVICE_OPENMP */ #endif /* HYPRE_OMP_DEVICE_H */ hypre-2.18.2/src/utilities/hypre_prefix_sum.c000066400000000000000000000114731355566575400213240ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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.18.2/src/utilities/hypre_printf.c000066400000000000000000000115641355566575400204460ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 // #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 */ newformat = hypre_TAlloc(char, newformatlen, HYPRE_MEMORY_HOST); 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 ) { 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); 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; } /* 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; } // #else // // /* this is used only to eliminate compiler warnings */ // HYPRE_Int hypre_printf_empty; // // #endif hypre-2.18.2/src/utilities/hypre_qsort.c000066400000000000000000000455771355566575400203270ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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_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; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* 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; } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ 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); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* 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); } /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /* sort both v and w, in place, but based only on entries in w */ void hypre_qsort2abs( 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 (fabs(w[i]) > fabs(w[left])) { hypre_swap2(v, w, ++last, i); } } hypre_swap2(v, w, left, last); hypre_qsort2abs(v, w, left, last-1); hypre_qsort2abs(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 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 (fabs(v[i]) < fabs(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 (fabs(v[i]) < fabs(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 (fabs(w[i]) < fabs(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 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.18.2/src/utilities/hypre_smp.h000066400000000000000000000007221355566575400177420ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/memory_dmalloc.c000066400000000000000000000063341355566575400207370ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 "hypre_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.18.2/src/utilities/mpistubs.c000066400000000000000000001111371355566575400176000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 *****************************************************************************/ #ifdef HYPRE_SEQUENTIAL HYPRE_Int hypre_MPI_Init( hypre_int *argc, char ***argv ) { return(0); } HYPRE_Int hypre_MPI_Finalize( ) { return(0); } HYPRE_Int hypre_MPI_Abort( hypre_MPI_Comm comm, HYPRE_Int errorcode ) { return(0); } HYPRE_Real hypre_MPI_Wtime( ) { return(0.0); } HYPRE_Real hypre_MPI_Wtick( ) { return(0.0); } HYPRE_Int hypre_MPI_Barrier( hypre_MPI_Comm comm ) { return(0); } HYPRE_Int hypre_MPI_Comm_create( hypre_MPI_Comm comm, hypre_MPI_Group group, hypre_MPI_Comm *newcomm ) { return(0); } HYPRE_Int hypre_MPI_Comm_dup( hypre_MPI_Comm comm, hypre_MPI_Comm *newcomm ) { return(0); } HYPRE_Int hypre_MPI_Comm_size( hypre_MPI_Comm comm, HYPRE_Int *size ) { *size = 1; return(0); } HYPRE_Int hypre_MPI_Comm_rank( hypre_MPI_Comm comm, HYPRE_Int *rank ) { *rank = 0; return(0); } HYPRE_Int hypre_MPI_Comm_free( hypre_MPI_Comm *comm ) { return 0; } HYPRE_Int hypre_MPI_Comm_group( hypre_MPI_Comm comm, hypre_MPI_Group *group ) { return(0); } HYPRE_Int hypre_MPI_Comm_split( hypre_MPI_Comm comm, HYPRE_Int n, HYPRE_Int m, hypre_MPI_Comm *comms ) { return(0); } HYPRE_Int hypre_MPI_Group_incl( hypre_MPI_Group group, HYPRE_Int n, HYPRE_Int *ranks, hypre_MPI_Group *newgroup ) { return(0); } HYPRE_Int hypre_MPI_Group_free( hypre_MPI_Group *group ) { return 0; } HYPRE_Int hypre_MPI_Address( void *location, hypre_MPI_Aint *address ) { return(0); } HYPRE_Int hypre_MPI_Get_count( hypre_MPI_Status *status, hypre_MPI_Datatype datatype, HYPRE_Int *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 ) { 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; 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_DOUBLE: { double *crecvbuf = (double *)recvbuf; double *csendbuf = (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_BYTE: { hypre_Memcpy(recvbuf, sendbuf, 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { 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 ) { return 0; } HYPRE_Int hypre_MPI_Startall( HYPRE_Int count, hypre_MPI_Request *array_of_requests ) { return 0; } HYPRE_Int hypre_MPI_Probe( HYPRE_Int source, HYPRE_Int tag, hypre_MPI_Comm comm, hypre_MPI_Status *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 ) { return 0; } HYPRE_Int hypre_MPI_Test( hypre_MPI_Request *request, HYPRE_Int *flag, hypre_MPI_Status *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 ) { *flag = 1; return(0); } HYPRE_Int hypre_MPI_Wait( hypre_MPI_Request *request, hypre_MPI_Status *status ) { return(0); } HYPRE_Int hypre_MPI_Waitall( HYPRE_Int count, hypre_MPI_Request *array_of_requests, hypre_MPI_Status *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 ) { 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; 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_DOUBLE: { double *crecvbuf = (double *)recvbuf; double *csendbuf = (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_BYTE: { hypre_Memcpy(recvbuf, sendbuf, 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_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 ) { return 0; } HYPRE_Int hypre_MPI_Type_contiguous( HYPRE_Int count, hypre_MPI_Datatype oldtype, hypre_MPI_Datatype *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 ) { 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 ) { 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 ) { return(0); } HYPRE_Int hypre_MPI_Type_commit( hypre_MPI_Datatype *datatype ) { return(0); } HYPRE_Int hypre_MPI_Type_free( hypre_MPI_Datatype *datatype ) { return(0); } HYPRE_Int hypre_MPI_Op_create( hypre_MPI_User_function *function, hypre_int commute, hypre_MPI_Op *op ) { return(0); } HYPRE_Int hypre_MPI_Op_free( hypre_MPI_Op *op ) { return(0); } #if defined(HYPRE_USING_CUDA) || 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 (0); } HYPRE_Int hypre_MPI_Info_create( hypre_MPI_Info *info ) { return (0); } HYPRE_Int hypre_MPI_Info_free( hypre_MPI_Info *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( ) { 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( ) { return MPI_Wtime(); } HYPRE_Real hypre_MPI_Wtick( ) { return 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 ) { return (HYPRE_Int) MPI_Allreduce(sendbuf, recvbuf, (hypre_int)count, datatype, op, 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 ) { 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_CUDA) || 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.18.2/src/utilities/mpistubs.h000066400000000000000000000373371355566575400176160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_INT #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE #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_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) (); 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_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_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_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_CUDA) || 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.18.2/src/utilities/protos000077500000000000000000000007031355566575400170360ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/protos.h000066400000000000000000000342071355566575400172670ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 ); /* hypre_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 ); #else #define hypre_conj(value) value #define hypre_cabs(value) fabs(value) #define hypre_creal(value) value #define hypre_cimag(value) 0.0 #endif /* hypre_general.c */ HYPRE_Int HYPRE_Init( hypre_int argc, char *argv[] ); HYPRE_Int HYPRE_Finalize(); HYPRE_Int hypre_GetDevice(hypre_Handle *hypre_handle); HYPRE_Int hypre_SetDevice(HYPRE_Int use_device, hypre_Handle *hypre_handle); HYPRE_Int hypre_SyncCudaDefaultStream(hypre_Handle *hypre_handle); void hypre_SetExecPolicy( HYPRE_Int policy ); HYPRE_Int hypre_GetExecPolicy1(HYPRE_Int location); HYPRE_Int hypre_GetExecPolicy2(HYPRE_Int location1, HYPRE_Int location2); /* hypre_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_scanf( const char *format , ... ); HYPRE_Int hypre_fscanf( FILE *stream , const char *format, ... ); HYPRE_Int hypre_sscanf( char *s , 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 /* hypre_qsort.c */ void hypre_swap ( HYPRE_Int *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_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_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_qsort2 ( HYPRE_Int *v , HYPRE_Real *w , HYPRE_Int left , HYPRE_Int right ); void hypre_qsort2abs( 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_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 ); /* hypre_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); /* hypre_merge_sort.c */ /** * Why merge sort? * 1) Merge sort can take advantage of eliminating duplicates. * 2) Merge sort is more efficiently parallelizable than qsort */ /** * Out of place merge sort with duplicate elimination * @ret number of unique elements */ HYPRE_Int hypre_merge_sort_unique(HYPRE_Int *in, HYPRE_Int *out, HYPRE_Int len); /** * Out of place merge sort with duplicate elimination * * @param out pointer to output can be in or temp * @ret number of unique elements */ HYPRE_Int hypre_merge_sort_unique2(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **out); void hypre_merge_sort(HYPRE_Int *in, HYPRE_Int *temp, HYPRE_Int len, HYPRE_Int **sorted); 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_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_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; /** * 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); #ifdef HYPRE_CONCURRENT_HOPSCOTCH void hypre_big_merge_sort(HYPRE_BigInt *in, HYPRE_BigInt *temp, HYPRE_Int len, HYPRE_BigInt **sorted); void hypre_big_sort_and_create_inverse_map(HYPRE_BigInt *in, HYPRE_Int len, HYPRE_BigInt **out, hypre_UnorderedBigIntMap *inverse_map); #endif /* hypre_cuda_utils.c */ #if defined(HYPRE_USING_CUDA) #ifdef __cplusplus extern "C++" { #endif dim3 hypre_GetDefaultCUDABlockDimension(); dim3 hypre_GetDefaultCUDAGridDimension( HYPRE_Int n, const char *granularity, dim3 bDim ); template HYPRE_Int hypreDevice_StableSortByTupleKey(HYPRE_Int N, T1 *keys1, T2 *keys2, T3 *vals, HYPRE_Int opt); #ifdef __cplusplus } #endif 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_Int first_col, HYPRE_Int *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_Int hypreDevice_IntegerInclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); HYPRE_Int hypreDevice_IntegerExclusiveScan(HYPRE_Int n, HYPRE_Int *d_i); 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 *d_row_ptr, HYPRE_Int *d_row_ind); HYPRE_Int hypreDevice_CsrRowPtrsToIndicesWithRowNum(HYPRE_Int nrows, HYPRE_Int *d_row_ptr, HYPRE_Int *d_row_num, 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_GenScatterAdd(HYPRE_Real *x, HYPRE_Int ny, HYPRE_Int *map, HYPRE_Real *y); HYPRE_Int hypreDevice_ScatterConstant(HYPRE_Int *x, HYPRE_Int n, HYPRE_Int *map, HYPRE_Int v); HYPRE_Int hypreDevice_IVAXPY(HYPRE_Int n, HYPRE_Complex *a, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_DiagScaleVector(HYPRE_Int n, HYPRE_Int *A_i, HYPRE_Complex *A_data, HYPRE_Complex *x, HYPRE_Complex *y); HYPRE_Int hypreDevice_BigToSmallCopy(HYPRE_Int *tgt, const HYPRE_BigInt *src, HYPRE_Int size); void hypre_CudaCompileFlagCheck(); #endif hypre-2.18.2/src/utilities/qsplit.c000066400000000000000000000044431355566575400172470ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National Security, 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 = fabs( values[ mid ]); for( j = first+1; j <= last; j ++) { if( fabs( 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.18.2/src/utilities/random.c000066400000000000000000000065431355566575400172160ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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" /* #if defined(HYPRE_USING_CUDA) __managed__ __device__ #endif */ 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. *--------------------------------------------------------------------------*/ /* HYPRE_CUDA_GLOBAL */ 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_CUDA_GLOBAL */ HYPRE_Int hypre_RandI() { 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_CUDA_GLOBAL */ HYPRE_Real hypre_Rand() { return ((HYPRE_Real)(hypre_RandI()) / m); } hypre-2.18.2/src/utilities/thread_protos.awk000066400000000000000000000014641355566575400211500ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/thread_wrappers.awk000066400000000000000000000102351355566575400214610ustar00rootroot00000000000000# Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/threading.c000066400000000000000000000027421355566575400177000ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore National 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( ) { 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( ) { 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( ) { 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.18.2/src/utilities/threading.h000066400000000000000000000015241355566575400177020ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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.18.2/src/utilities/timer.c000066400000000000000000000030201355566575400170410ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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 * * If TIMER_USE_MPI is defined, then the MPI timers are used to get * wallclock seconds, since we assume that the MPI timers have better * resolution than the system timers. */ #include "_hypre_utilities.h" #include #ifndef WIN32 #include #include #endif #ifdef TIMER_USE_MPI #include "mpi.h" #endif HYPRE_Real time_getWallclockSeconds(void) { #ifdef TIMER_USE_MPI 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.18.2/src/utilities/timing.c000066400000000000000000000253561355566575400172300ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_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) { 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( ) { 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-2.18.2/src/utilities/timing.h000066400000000000000000000072541355566575400172320ustar00rootroot00000000000000/****************************************************************************** * Copyright 1998-2019 Lawrence Livermore 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_IncFLOPCount(inc) #define hypre_BeginTiming(i) #define hypre_EndTiming(i) #define hypre_PrintTiming(heading, comm) #define hypre_ClearTiming() /*-------------------------------------------------------------------------- * 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_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 ); #endif #ifdef __cplusplus } #endif #endif hypre-2.18.2/src/utilities/version000077500000000000000000000027071355566575400172030ustar00rootroot00000000000000#!/bin/sh # Copyright 1998-2019 Lawrence Livermore 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 " -number - prints the version number" echo " -date - prints the version day" echo " -time - prints the version 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" NUMBER=`grep "HYPRE_VERSION=" $VFILE | cut -d= -f 2 | sed 's/"//g'` 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 $NUMBER Date: $DATE` # this defines the print lines for the various options case $1 in -number) VPRINT=$NUMBER;; -date) VPRINT=$DATE;; -time) VPRINT=$TIME;; esac # print the version information echo $VPRINT