--- Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ Makefile.am 2008-01-29 18:25:24.000000000 +0000 @@ -0,0 +1,2 @@ +SUBDIRS = Source Include Demo +EXTRA_DIST = README.txt --- configure.ac 1970-01-01 01:00:00.000000000 +0100 +++ configure.ac 2008-01-29 18:25:24.000000000 +0000 @@ -0,0 +1,21 @@ +# -*- Autoconf -*- +AC_PREREQ(2.59) +AC_INIT(umfpack, 5.2.0, davis@cise.ufl.edu) +AC_CONFIG_SRCDIR([Source/umf_solve.c]) +AC_CONFIG_HEADER([config.h]) +AM_INIT_AUTOMAKE([foreign]) +AC_PROG_INSTALL +AC_PROG_F77 +AC_PROG_LIBTOOL +AC_CHECK_LIB(m, sqrt) +sinclude(acx_blas.m4) +ACX_BLAS +if test x"$BLAS_LIBS" = x; then + AC_MSG_ERROR([Cannot find blas libraries]) +fi +AC_CHECK_LIB(amd, amd_aat) +AC_CONFIG_FILES([Source/Makefile + Include/Makefile + Demo/Makefile + Makefile]) +AC_OUTPUT --- acx_blas.m4 1970-01-01 01:00:00.000000000 +0100 +++ acx_blas.m4 2008-01-29 18:25:24.000000000 +0000 @@ -0,0 +1,191 @@ +##### http://autoconf-archive.cryp.to/acx_blas.html +# +# SYNOPSIS +# +# ACX_BLAS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro looks for a library that implements the BLAS +# linear-algebra interface (see http://www.netlib.org/blas/). On +# success, it sets the BLAS_LIBS output variable to hold the +# requisite library linkages. +# +# To link with BLAS, you should link with: +# +# $BLAS_LIBS $LIBS $FLIBS +# +# in that order. FLIBS is the output variable of the +# AC_F77_LIBRARY_LDFLAGS macro (called if necessary by ACX_BLAS), and +# is sometimes necessary in order to link with F77 libraries. Users +# will also need to use AC_F77_DUMMY_MAIN (see the autoconf manual), +# for the same reason. +# +# Many libraries are searched for, from ATLAS to CXML to ESSL. The +# user may also use --with-blas= in order to use some specific +# BLAS library . In order to link successfully, however, be +# aware that you will probably need to use the same Fortran compiler +# (which can be set via the F77 env. var.) as was used to compile the +# BLAS library. +# +# ACTION-IF-FOUND is a list of shell commands to run if a BLAS +# library is found, and ACTION-IF-NOT-FOUND is a list of commands to +# run it if it is not found. If ACTION-IF-FOUND is not specified, the +# default action will define HAVE_BLAS. +# +# This macro requires autoconf 2.50 or later. +# +# LAST MODIFICATION +# +# 2007-07-29 +# +# COPYLEFT +# +# Copyright (c) 2007 Steven G. Johnson +# +# 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 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, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([ACX_BLAS], [ +AC_PREREQ(2.50) +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +acx_blas_ok=no + +AC_ARG_WITH(blas, + [AC_HELP_STRING([--with-blas=], [use BLAS library ])]) +case $with_blas in + yes | "") ;; + no) acx_blas_ok=disable ;; + -* | */* | *.a | *.so | *.so.* | *.o) BLAS_LIBS="$with_blas" ;; + *) BLAS_LIBS="-l$with_blas" ;; +esac + +# Get fortran linker names of BLAS functions to check for. +AC_F77_FUNC(sgemm) +AC_F77_FUNC(dgemm) + +acx_blas_save_LIBS="$LIBS" +LIBS="$LIBS $FLIBS" + +# First, check BLAS_LIBS environment variable +if test $acx_blas_ok = no; then +if test "x$BLAS_LIBS" != x; then + save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" + AC_MSG_CHECKING([for $sgemm in $BLAS_LIBS]) + AC_TRY_LINK_FUNC($sgemm, [acx_blas_ok=yes], [BLAS_LIBS=""]) + AC_MSG_RESULT($acx_blas_ok) + LIBS="$save_LIBS" +fi +fi + +# BLAS linked to by default? (happens on some supercomputers) +if test $acx_blas_ok = no; then + save_LIBS="$LIBS"; LIBS="$LIBS" + AC_CHECK_FUNC($sgemm, [acx_blas_ok=yes]) + LIBS="$save_LIBS" +fi + +# BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) +if test $acx_blas_ok = no; then + AC_CHECK_LIB(atlas, ATL_xerbla, + [AC_CHECK_LIB(f77blas, $sgemm, + [AC_CHECK_LIB(cblas, cblas_dgemm, + [acx_blas_ok=yes + BLAS_LIBS="-lcblas -lf77blas -latlas"], + [], [-lf77blas -latlas])], + [], [-latlas])]) +fi + +# BLAS in PhiPACK libraries? (requires generic BLAS lib, too) +if test $acx_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, + [AC_CHECK_LIB(dgemm, $dgemm, + [AC_CHECK_LIB(sgemm, $sgemm, + [acx_blas_ok=yes; BLAS_LIBS="-lsgemm -ldgemm -lblas"], + [], [-lblas])], + [], [-lblas])]) +fi + +# BLAS in Alpha CXML library? +if test $acx_blas_ok = no; then + AC_CHECK_LIB(cxml, $sgemm, [acx_blas_ok=yes;BLAS_LIBS="-lcxml"]) +fi + +# BLAS in Alpha DXML library? (now called CXML, see above) +if test $acx_blas_ok = no; then + AC_CHECK_LIB(dxml, $sgemm, [acx_blas_ok=yes;BLAS_LIBS="-ldxml"]) +fi + +# BLAS in Sun Performance library? +if test $acx_blas_ok = no; then + if test "x$GCC" != xyes; then # only works with Sun CC + AC_CHECK_LIB(sunmath, acosp, + [AC_CHECK_LIB(sunperf, $sgemm, + [BLAS_LIBS="-xlic_lib=sunperf -lsunmath" + acx_blas_ok=yes],[],[-lsunmath])]) + fi +fi + +# BLAS in SCSL library? (SGI/Cray Scientific Library) +if test $acx_blas_ok = no; then + AC_CHECK_LIB(scs, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lscs"]) +fi + +# BLAS in SGIMATH library? +if test $acx_blas_ok = no; then + AC_CHECK_LIB(complib.sgimath, $sgemm, + [acx_blas_ok=yes; BLAS_LIBS="-lcomplib.sgimath"]) +fi + +# BLAS in IBM ESSL library? (requires generic BLAS lib, too) +if test $acx_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, + [AC_CHECK_LIB(essl, $sgemm, + [acx_blas_ok=yes; BLAS_LIBS="-lessl -lblas"], + [], [-lblas $FLIBS])]) +fi + +# Generic BLAS library? +if test $acx_blas_ok = no; then + AC_CHECK_LIB(blas, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lblas"]) +fi + +AC_SUBST(BLAS_LIBS) + +LIBS="$acx_blas_save_LIBS" + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_blas_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_BLAS,1,[Define if you have a BLAS library.]),[$1]) + : +else + acx_blas_ok=no + $2 +fi +])dnl ACX_BLAS --- Include/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ Include/Makefile.am 2008-01-29 18:25:24.000000000 +0000 @@ -0,0 +1,34 @@ +include_HEADERS = \ + umfpack.h \ + umfpack_col_to_triplet.h \ + umfpack_defaults.h \ + umfpack_free_numeric.h \ + umfpack_free_symbolic.h \ + umfpack_get_determinant.h \ + umfpack_get_lunz.h \ + umfpack_get_numeric.h \ + umfpack_get_symbolic.h \ + umfpack_global.h \ + umfpack_load_numeric.h \ + umfpack_load_symbolic.h \ + umfpack_numeric.h \ + umfpack_qsymbolic.h \ + umfpack_report_control.h \ + umfpack_report_info.h \ + umfpack_report_matrix.h \ + umfpack_report_numeric.h \ + umfpack_report_perm.h \ + umfpack_report_status.h \ + umfpack_report_symbolic.h \ + umfpack_report_triplet.h \ + umfpack_report_vector.h \ + umfpack_save_numeric.h \ + umfpack_save_symbolic.h \ + umfpack_scale.h \ + umfpack_solve.h \ + umfpack_symbolic.h \ + umfpack_tictoc.h \ + umfpack_timer.h \ + umfpack_transpose.h \ + umfpack_triplet_to_col.h \ + umfpack_wsolve.h --- Source/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ Source/Makefile.am 2008-01-29 18:25:24.000000000 +0000 @@ -0,0 +1,221 @@ +AM_CPPFLAGS = -I$(top_srcdir)/Include +lib_LTLIBRARIES = libumfpack.la + +# non-user-callable umf_*.[ch] files: +UMFCH = umf_assemble umf_blas3_update umf_build_tuples umf_create_element \ + umf_dump umf_extend_front umf_garbage_collection umf_get_memory \ + umf_init_front umf_kernel umf_kernel_init umf_kernel_wrapup \ + umf_local_search umf_lsolve umf_ltsolve umf_mem_alloc_element \ + umf_mem_alloc_head_block umf_mem_alloc_tail_block \ + umf_mem_free_tail_block umf_mem_init_memoryspace \ + umf_report_vector umf_row_search umf_scale_column \ + umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ + umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ + umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ + umf_store_lu umf_scale + +# non-user-callable umf_*.[ch] files, int/UF_long versions only (no real/complex): +UMFINT = umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ + umf_is_permutation umf_malloc umf_realloc umf_report_perm \ + umf_singletons + +# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, +# umf_triplet.c, and umf_assemble.c , with int/UF_long and real/complex versions: +UMF_CREATED = umf_lhsolve umf_uhsolve umf_triplet_map_nox \ + umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ + umf_assemble_fixq umf_store_lu_drop + +# non-user-callable, int/UF_long and real/complex versions: +UMF = $(UMF_CREATED) $(UMFCH) + +# user-callable umfpack_*.[ch] files (int/UF_long and real/complex): +UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ + umfpack_qsymbolic umfpack_report_control umfpack_report_info \ + umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ + umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale \ + umfpack_load_numeric umfpack_save_numeric \ + umfpack_load_symbolic umfpack_save_symbolic + +# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): +# with int/UF_long and real/complex versions: +UMFPACKW = umfpack_wsolve + +USER = $(UMFPACKW) $(UMFPACK) + +# user-callable, only one version for int/UF_long, real/complex, *.[ch] files: +GENERIC = umfpack_timer umfpack_tictoc umfpack_global + + +#------------------------------------------------------------------------------- +# object files for each version +#------------------------------------------------------------------------------- + +DI = $(addsuffix .lo, $(subst umf_,umf_di_,$(UMF)) $(subst umfpack_,umfpack_di_,$(USER))) +DL = $(addsuffix .lo, $(subst umf_,umf_dl_,$(UMF)) $(subst umfpack_,umfpack_dl_,$(USER))) +ZI = $(addsuffix .lo, $(subst umf_,umf_zi_,$(UMF)) $(subst umfpack_,umfpack_zi_,$(USER))) +ZL = $(addsuffix .lo, $(subst umf_,umf_zl_,$(UMF)) $(subst umfpack_,umfpack_zl_,$(USER))) +II = $(addsuffix .lo, $(subst umf_,umf_i_,$(UMFINT))) +LL = $(addsuffix .lo, $(subst umf_,umf_l_,$(UMFINT))) +GN = $(addsuffix .lo, $(subst umfpack_,umfpack_gn_,$(GENERIC))) + +#------------------------------------------------------------------------------- +# compile each int and UF_long routine (with no real/complex version) +#------------------------------------------------------------------------------- + +umf_i_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DDINT -c $< -o $@ + +umf_l_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the DI version +#------------------------------------------------------------------------------- + +umf_di_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DDINT -c $< -o $@ + +umf_di_%hsolve.lo: umf_%tsolve.c $(INC) + $(LTCOMPILE) -DDINT -DCONJUGATE_SOLVE -c $< -o $@ + +umf_di_triplet_map_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDINT -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_di_triplet_map_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDINT -DDO_MAP -c $< -o $@ + +umf_di_triplet_nomap_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDINT -DDO_VALUES -c $< -o $@ + +umf_di_triplet_nomap_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDINT -c $< -o $@ + +umf_di_assemble_fixq.lo: umf_assemble.c $(INC) + $(LTCOMPILE) -DDINT -DFIXQ -c $< -o $@ + +umf_di_store_lu_drop.lo: umf_store_lu.c $(INC) + $(LTCOMPILE) -DDINT -DDROP -c $< -o $@ + +umfpack_di_wsolve.lo: umfpack_solve.c $(INC) + $(LTCOMPILE) -DDINT -DWSOLVE -c $< -o $@ + +umfpack_di_%.lo: umfpack_%.c $(INC) + $(LTCOMPILE) -DDINT -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the DL version +#------------------------------------------------------------------------------- + +umf_dl_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DDLONG -c $< -o $@ + +umf_dl_%hsolve.lo: umf_%tsolve.c $(INC) + $(LTCOMPILE) -DDLONG -DCONJUGATE_SOLVE -c $< -o $@ + +umf_dl_triplet_map_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDLONG -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_dl_triplet_map_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDLONG -DDO_MAP -c $< -o $@ + +umf_dl_triplet_nomap_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDLONG -DDO_VALUES -c $< -o $@ + +umf_dl_triplet_nomap_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DDLONG -c $< -o $@ + +umf_dl_assemble_fixq.lo: umf_assemble.c $(INC) + $(LTCOMPILE) -DDLONG -DFIXQ -c $< -o $@ + +umf_dl_store_lu_drop.lo: umf_store_lu.c $(INC) + $(LTCOMPILE) -DDLONG -DDROP -c $< -o $@ + +umfpack_dl_wsolve.lo: umfpack_solve.c $(INC) + $(LTCOMPILE) -DDLONG -DWSOLVE -c $< -o $@ + +umfpack_dl_%.lo: umfpack_%.c $(INC) + $(LTCOMPILE) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the ZI version +#------------------------------------------------------------------------------- + +umf_zi_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DZINT -c $< -o $@ + +umf_zi_%hsolve.lo: umf_%tsolve.c $(INC) + $(LTCOMPILE) -DZINT -DCONJUGATE_SOLVE -c $< -o $@ + +umf_zi_triplet_map_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZINT -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_zi_triplet_map_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZINT -DDO_MAP -c $< -o $@ + +umf_zi_triplet_nomap_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZINT -DDO_VALUES -c $< -o $@ + +umf_zi_triplet_nomap_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZINT -c $< -o $@ + +umf_zi_assemble_fixq.lo: umf_assemble.c $(INC) + $(LTCOMPILE) -DZINT -DFIXQ -c $< -o $@ + +umf_zi_store_lu_drop.lo: umf_store_lu.c $(INC) + $(LTCOMPILE) -DZINT -DDROP -c $< -o $@ + +umfpack_zi_wsolve.lo: umfpack_solve.c $(INC) + $(LTCOMPILE) -DZINT -DWSOLVE -c $< -o $@ + +umfpack_zi_%.lo: umfpack_%.c $(INC) + $(LTCOMPILE) -DZINT -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the ZL version +#------------------------------------------------------------------------------- + +umf_zl_%.lo: umf_%.c $(INC) + $(LTCOMPILE) -DZLONG -c $< -o $@ + +umf_zl_%hsolve.lo: umf_%tsolve.c $(INC) + $(LTCOMPILE) -DZLONG -DCONJUGATE_SOLVE -c $< -o $@ + +umf_zl_triplet_map_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZLONG -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_zl_triplet_map_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZLONG -DDO_MAP -c $< -o $@ + +umf_zl_triplet_nomap_x.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZLONG -DDO_VALUES -c $< -o $@ + +umf_zl_triplet_nomap_nox.lo: umf_triplet.c $(INC) + $(LTCOMPILE) -DZLONG -c $< -o $@ + +umf_zl_assemble_fixq.lo: umf_assemble.c $(INC) + $(LTCOMPILE) -DZLONG -DFIXQ -c $< -o $@ + +umf_zl_store_lu_drop.lo: umf_store_lu.c $(INC) + $(LTCOMPILE) -DZLONG -DDROP -c $< -o $@ + +umfpack_zl_wsolve.lo: umfpack_solve.c $(INC) + $(LTCOMPILE) -DZLONG -DWSOLVE -c $< -o $@ + +umfpack_zl_%.lo: umfpack_%.c $(INC) + $(LTCOMPILE) -DZLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# Create the generic routines (GN) using a generic rule +#------------------------------------------------------------------------------- + +umfpack_gn_%.lo: umfpack_%.c $(INC) + $(LTCOMPILE) -c $< -o $@ + + +libumfpack_la_SOURCES = +libumfpack_la_LIBADD = $(BLAS_LIBS) -lamd -lm \ + $(II) $(LL) $(GN) $(DI) $(DL) $(ZI) $(ZL) --- Demo/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ Demo/Makefile.am 2008-01-29 18:38:19.000000000 +0000 @@ -0,0 +1,44 @@ +AM_CPPFLAGS = -I$(top_srcdir)/Include +LDADD = $(top_builddir)/Source/libumfpack.la + +check_PROGRAMS = umfpack_simple \ + umfpack_di_demo \ + umfpack_dl_demo \ + umfpack_zi_demo \ + umfpack_zl_demo + +umfpack_%_demo.c: umfpack_xx_demo.c umfpack_%_demo.sed + - sed -f umfpack_$*_demo.sed < umfpack_xx_demo.c > umfpack_$*_demo.c + +umfpack_simple_SOURCES = umfpack_simple.c +umfpack_di_demo_SOURCES = umfpack_di_demo.c +umfpack_dl_demo_SOURCES = umfpack_dl_demo.c +umfpack_zi_demo_SOURCES = umfpack_zi_demo.c +umfpack_zl_demo_SOURCES = umfpack_zl_demo.c + +check-local: $(check_PROGRAMS) + @total=0; failed=0; \ + ./umfpack_simple; \ + if [ "x$$?" = "x0" ]; then \ + echo "Test umfpack_simple PASSED."; \ + else \ + echo "Test umfpack_simple FAILED!!!"; \ + failed=$$(($$failed + 1)); \ + fi; \ + total=$$(($$total + 1)); \ + for i in *demo; do \ + echo "--- Testing $$i ---"; \ + ./$$i$(EXEEXT) > my_$$i.out; \ + diff $$i.out my_$$i.out; \ + if [ "x$$?" = "x0" ]; then \ + echo "Test \`$$i' PASSED."; \ + else \ + echo "Test \`$$i' FAILED!!!"; \ + failed=$$(($$failed + 1)); \ + fi; \ + total=$$(($$total + 1)); \ + done; \ + if [ $$failed -gt 0 ]; then \ + echo "*** ERROR: $$failed/$$total tests failed!!!"; \ + echo "Please check the failures before reporting"; \ + fi