arpackmm: add --dense option. (#194)

This commit is contained in:
Franck HOUSSEN
2019-03-02 18:54:50 +01:00
committed by Sylvestre Ledru
parent 8fe4734da8
commit 6615574e37
7 changed files with 563 additions and 360 deletions
+2 -2
View File
@@ -53,8 +53,8 @@ EXAMPLES/SIMPLE/[sdcz]nsimp
EXAMPLES/SVD/[sd]svd
EXAMPLES/SYM/[sd]sdrv[123456]
EXAMPLES/MATRIX_MARKET/arpackmm
EXAMPLES/MATRIX_MARKET/resid.out
EXAMPLES/MATRIX_MARKET/v.out
EXAMPLES/MATRIX_MARKET/arpackmm.resid.out
EXAMPLES/MATRIX_MARKET/arpackmm.v.out
PARPACK/EXAMPLES/MPI/p[sd]ndrv[13]
PARPACK/EXAMPLES/MPI/p[sd]sdrv1
PARPACK/EXAMPLES/MPI/p[cz]ndrv1
+1 -1
View File
@@ -3,7 +3,7 @@
* arpackmm: add --slvItrPC option (PC: Jacobi, ILU).
* arpackmm: add --slv LLT LDLT (for SPD matrices).
* arpackmm: add --simplePrec option (to enable use of s*upd).
* arpackmm: add --dense option.
arpack-ng - 3.7.0
+24 -4
View File
@@ -81,14 +81,34 @@ if (ICBEXMM)
if (NOT EIGEN3_ITERATIVE_SOLVER_DIR)
message(FATAL_ERROR "-- Eigen/IterativeLinearSolvers header not found.")
endif ()
find_path(EIGEN3_SLU_SOLVER_DIR NAMES SparseLU PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_SLU_SOLVER_DIR)
find_path(EIGEN3_SPARSELU_SOLVER_DIR NAMES SparseLU PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_SPARSELU_SOLVER_DIR)
message(FATAL_ERROR "-- Eigen/SparseLU header not found.")
endif ()
find_path(EIGEN3_SQR_SOLVER_DIR NAMES SparseQR PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_SQR_SOLVER_DIR)
find_path(EIGEN3_SPARSEQR_SOLVER_DIR NAMES SparseQR PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_SPARSEQR_SOLVER_DIR)
message(FATAL_ERROR "-- Eigen/SparseQR header not found.")
endif ()
find_path(EIGEN3_SPARSECHOLESKY_SOLVER_DIR NAMES SparseCholesky PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_SPARSECHOLESKY_SOLVER_DIR)
message(FATAL_ERROR "-- Eigen/SparseCholesky header not found.")
endif ()
find_path(EIGEN3_DENSE_DIR NAMES Dense PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_DENSE_DIR)
message(FATAL_ERROR "-- Eigen/Dense header not found.")
endif ()
find_path(EIGEN3_DENSELU_DIR NAMES LU PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_DENSELU_DIR)
message(FATAL_ERROR "-- Eigen/LU header not found.")
endif ()
find_path(EIGEN3_DENSEQR_DIR NAMES QR PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_DENSEQR_DIR)
message(FATAL_ERROR "-- Eigen/QR header not found.")
endif ()
find_path(EIGEN3_DENSECHOLESKY_DIR NAMES Cholesky PATHS ${EIGEN3_INCLUDE_DIRS} PATH_SUFFIXES Eigen)
if (NOT EIGEN3_DENSECHOLESKY_DIR)
message(FATAL_ERROR "-- Eigen/Cholesky header not found.")
endif ()
set(ICB "ON")
endif ()
+1 -1
View File
@@ -11,4 +11,4 @@ TESTS = arpackmm.sh
arpackmm_SOURCES = arpackmm.cpp
CLEANFILES = resid.out v.out
CLEANFILES = arpackmm.resid.out arpackmm.v.out
File diff suppressed because it is too large Load Diff
+39 -30
View File
@@ -34,48 +34,57 @@ do
do
for tol in "" "--tol 1.e-5"
do
for slv in " --slvItrTol 1.e-07 --slvItrMaxIt 150" "--slv CG --slvItrTol 1.e-07 --slvItrMaxIt 150" \
" --slvItrPC ILU" "--slv CG --slvItrPC ILU#1.e-06#2" \
for slv in "--slv BiCG --slvItrTol 1.e-07 --slvItrMaxIt 150" "--slv CG --slvItrTol 1.e-07 --slvItrMaxIt 150" \
"--slv BiCG --slvItrPC ILU" "--slv CG --slvItrPC ILU#1.e-06#2" \
"--slv LU" "--slv QR#1.e-06" \
"--slv LLT" "--slv LLT#0.#1." \
"--slv LDLT" "--slv LDLT#0.#1."
do
for rs in "" "--schur"
do
for ds in "" "--simplePrec"
for dsPrec in "" "--simplePrec"
do
export extraGenPb=""
if [[ "$genPb" == *genPb* ]]; then
export extraGenPb="$shiftOpt" # Force shift if genPb.
fi
if [[ "$slv" == *CG* ]]; then
if [[ "$eigPb" == *nonSymPb* ]]; then
continue # Skip CG that could fail (CG is meant to deal with sym matrices).
for dsMat in "" "--dense false" "--dense true"
do
export extraGenPb=""
if [[ "$genPb" == *genPb* ]]; then
export extraGenPb="$shiftOpt" # Force shift if genPb.
fi
fi
if [[ "$slv" == *LLT* ]] || [[ "$slv" == *LDLT* ]]; then
if [[ "$eigPb" == *nonSymPb* ]] || [[ "$genPb" == *genPb* ]]; then
continue # Skip LLT/LDLT that could fail (LLT/LDLT are meant to deal with SPD matrices).
if [[ "$slv" == *CG* ]]; then
if [[ "$eigPb" == *nonSymPb* ]]; then
continue # Skip CG that could fail (CG is meant to deal with sym matrices).
fi
fi
fi
# Run arpackmm: use --nbCV 6 to ease convergence, and, --verbose 3 for debug.
export CMD="./arpackmm $eigPb $genPb $smallMag $shiftRI $invert $tol $slv $rs $ds $extraGenPb --nbCV 6 --verbose 3 --debug 3"
echo "$CMD"
eval "$CMD &> arpackmm.run.log"
echo ""
echo "========================================================================================"
echo ""
if [[ "$slv" == *LLT* ]] || [[ "$slv" == *LDLT* ]]; then
if [[ "$eigPb" == *nonSymPb* ]] || [[ "$genPb" == *genPb* ]]; then
continue # Skip LLT/LDLT that could fail (LLT/LDLT are meant to deal with SPD matrices).
fi
fi
# Run arpackmm: re-run with restart.
export CMD="$CMD --restart"
echo "$CMD"
eval "$CMD &> arpackmm.run.log"
echo ""
echo "========================================================================================"
echo ""
if [[ "$dsMat" == *dense* ]]; then
if [[ "$slv" == *CG* ]]; then
continue # Iterative solvers are not allowed when using dense matrices.
fi
fi
# Run arpackmm: use --nbCV 6 to ease convergence, and, --verbose 3 for debug.
export CMD="./arpackmm $eigPb $genPb $smallMag $shiftRI $invert $tol $slv $rs $dsPrec $dsMat $extraGenPb --nbCV 6 --verbose 3 --debug 3"
echo "$CMD"
eval "$CMD &> arpackmm.run.log"
echo ""
echo "========================================================================================"
echo ""
# Run arpackmm: re-run with restart.
export CMD="$CMD --restart"
echo "$CMD"
eval "$CMD &> arpackmm.run.log"
echo ""
echo "========================================================================================"
echo ""
done
done
done
done
+15
View File
@@ -93,6 +93,21 @@ if test x"$enable_icb_exmm" != x"no"; then
AC_CHECK_HEADER([Eigen/SparseQR],
[],
[AC_MSG_ERROR([Eigen/SparseQR not found])])
AC_CHECK_HEADER([Eigen/SparseCholesky],
[],
[AC_MSG_ERROR([Eigen/SparseCholesky not found])])
AC_CHECK_HEADER([Eigen/Dense],
[],
[AC_MSG_ERROR([Eigen/Dense not found])])
AC_CHECK_HEADER([Eigen/LU],
[],
[AC_MSG_ERROR([Eigen/LU not found])])
AC_CHECK_HEADER([Eigen/QR],
[],
[AC_MSG_ERROR([Eigen/QR not found])])
AC_CHECK_HEADER([Eigen/Cholesky],
[],
[AC_MSG_ERROR([Eigen/Cholesky not found])])
CPPFLAGS=$CPPFLAGS_SAVE
AC_LANG_POP([C++])
fi